Execute
문제로 주어진 64bof_basic파일을 실행시키면 입력을 받고 hello라는 문자열과 앞서 내가 입력한 문자열을 출력해준다. 이외에는 특별히 address를 leak하거나 다른 동작은 하지 않는다. 프로그램의 동작을 파악하기 위해 IDA를 통해 확인해보자.
Analyze
보호기법을 확인해보면 nxbit만 활성화 되어있다. 따라서 이번문제는 shellcode를 직접 올리는것이 아니라 단순이 ret변조를 통해 프로그램 실행 흐름을 변경해서 shell을 얻는 문제인 것 같다는 생각을 하였다.
Main
- Line 6 : scanf함수를 통해 문자열 형태로 s변수를 입력받는다.
- Line 7 :strlen함수로 앞서 입력한 문자열의 개수를 v5에 대입한다.
- Line 8 : hello문자열과 함께 s변수를 출력한다.
Line 6의 scanf함수는 입력값의 길이를 검증하지 않기 때문에 buffer overflow취약점이 발생 할 수 있다. 따라서 s변수 크기보다 더 큰 입력을 통해 retrun address를 제어할 수 있을 것이다. 또한 어디로 return address를 조작할지 찾던중 callMeMaybe함수를 찾을 수 있었다.
CallMeMaybe
execve함수를 통해 /bin/sh명령을 실행해 shell을 획득 할수 있는 것을 확인 하였다.
Solve
따라서 이제 필요한 것은 return address를 제어하기 위한 dummy의 크기와 callMeMaybe함수의 주소이다. 먼저 dummy의 크기를 구해보자
s변수가 선언되는 위치는 rbp-0x110위치이다. 따라서 dummy는 0x110+sfp 만큼의 크기를 가질 것이다. 32bit 실행파일일 경우 sfp는 4byte이지만 현재 문제로 주어진 파일을 64bit이므로 8byte의 크키를 가질것이다.
이제 callMeMaybe함수의 시작 주소를 확인해보자.
해당함수는 0x0000000000400606에서 시작하는 것을 알 수 있다. 결과적으로 payload는 아래와 같은 형태를 가질 것이다.
dummy*0x110 byte + sfp(8byte) + 0x0000000000400606(callMeMaybe address)
exploit은 아래와 같이 작성하였다.
성공적으로 shell을 얻어 flag를 획득 할 수 있었다.
'Wargmae > HackCTF' 카테고리의 다른 글
[Hack CTF – Simple_Overflow_ver_2] (0) | 2021.01.06 |
---|---|
[Hack CTF – x64 Simple_size_BOF] (0) | 2021.01.05 |
[Hack CTF – 내 버퍼가 흘러넘친다!!!] (1) | 2021.01.03 |
[Hack CTF - Baisc_FSB] (0) | 2021.01.03 |
[Hack CTF - Basic_BOF #2] (0) | 2021.01.02 |