Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking/HackCTF

HackCTF g++ pwn Write-up

Ainsetin 2020. 1. 7. 08:05

이번엔 C++로 작성된 바이너리인 듯하다. 한번 도전해보자.

 

 

checksec부터 해보자.

 

NX bit만 걸려있는 것을 볼 수 있다.

 

왜 g++ 컴파일러인지는 IDA로 까보면 알 수 있다.

 

main()
vuln()

보는 것과 같이 std::string같은 c++ 문법이 있는 것을 확인할 수 있다. 하지만 여기서 필요한 부분만 가져오면 된다.

 

 

우리의 목적은 get_flag 함수를 실행시켜 flag를 획득하는 것이다.

 

이 바이너리를 디스어셈블한 결과로 보면 더 쉽게 이해할 수 있다.

 

여기서 중요한 부분은 fgets의 인자이다. 20h, 즉 32byte를 입력받고 마지막에 길이 제한 없이 strcpy를 한다.

 

그런데 문자열 s는 3Ch, 즉 60byte 뒤에 SFP, RET가 존재하는 것이다. 그러면 BOF가 안될 텐데....?

 

그런데 의심 가는 부분이 있다. 왜 you와 I가 있고 replace 함수가 있을까.....

 

그렇다. I를 you로 replace 해서 BOF를 터뜨릴 수 있는 환경을 만드는 것이다.

 

따라서 우리는 I를 3byte라고 생각하고 I 20개와 SFP 4byte, get_flag 주소 4byte를 채우면 실제로는 28byte를 입력한 것이고, replace 후에는 68byte가 strcpy 된 효과를 볼 수 있다.

 

get_flag의 시작 주소는 0x8048f0d이다.

 

그럼 exploit code를 작성해보자.

 

 

Tell me something about yourself 문자열이 조금 늦게 나와서 p.recvuntil()을 포함하면 오류가 난다. 따라서 그냥 바로 p.sendline()을 하면 되므로 #으로 주석 처리했다.

 

 

flag가 나오는 것을 볼 수 있다.

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

HackCTF 1996 Write-up  (0) 2020.01.07
HackCTF poet Write-up  (0) 2020.01.07
HackCTF RTL_World Write-up  (0) 2020.01.06
HackCTF Yes or no Write-up  (0) 2020.01.06
HackCTF BOF_PIE Write-up  (0) 2020.01.06