이번엔 C++로 작성된 바이너리인 듯하다. 한번 도전해보자.
checksec부터 해보자.
NX bit만 걸려있는 것을 볼 수 있다.
왜 g++ 컴파일러인지는 IDA로 까보면 알 수 있다.
보는 것과 같이 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 |