Execute
문제로 주어진 파일을 실행하면 name과 input을 받고 프로그램을 종료한다. 이외에는 특별한 동작을 하지 않는다.
Analyze
먼저 prob1 파일의 보호기법을 확인해보자.
아무것도 걸려있지 않을 것을 확인 할 수 있다. Nxbit가 앞선 문제에서는 걸려있었는데 해제 되어있는 것 보아 shell을 얻기 위한 shellcode를 직접 넣지 않을까? 라고 생각하였다. 정확하게 프로그램의 동작을 알기 위해 IDA를 통해 열어보았다.
Main
- Line 5 : setvbuf함수를 이용해 버퍼를 비운다.
- Line 7 : read 함수를 이용해 name변수에 0x32만큼 입력을 받는다.
- Line 9 : gets함수를 이용해 s변수를 입력 받는다.
Line 9의 gets 함수는 입력 값의 길이를 검증하지 않기 때문에 buffer overflow가 발생 할 수 있다.
함수들을 찾아보면 flag를 출력해주거나 shell을 띄울 수 있을 만한 함수들이 보이지 않는다. 따라서 앞서 예상했던 것처럼 직접 shellcode를 메모리에 올려서 풀어야하는 문제인 것 같다. name변수에 쉘 코드를 넣고 buffer overflow를 통해 return address를 name변수의 주소로 덮어쓴다면 문제를 성공적으로 해결 할 수 있을 것이다.
name변수는 main함수 내부에 선언된 부분이 보이지 않는다. 이는 전역변수로 선언되었기 때문인데 초기화되지 않은 전역변수 이므로 bss영역에 위치하고 있을 것이다. 따라서 IDA에서 [Shift+f7]을 눌러 Segmentation 영역에서 bss부분을 확인해 본다.
name변수가 bss영역에 존재 하는 것이 확인되었다. 추가로 name변수의 위치까지 확인하였다.
solve
앞서 언급한 것처럼 공격은 name변수에 shellcode를 올리고 gets함수로 인해 발생하는 buffer overflow를 이용해 return address를 name변수의 시작주로로 넣을 것이다.
먼저 shellcode가 들어갈 수 있는 크기는 0x32(50)byte이다. 따라서 해당 크기보다 작은 shellcode를 생성해야 한다. msfvenom을 이용해 /bin/sh을 실행하는 shellcode를 생성해보자.
buf = b""
buf += b"\x6a\x0b\x58\x99\x52\x66\x68\x2d\x63\x89\xe7\x68\x2f"
buf += b"\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\x52\xe8\x08"
buf += b"\x00\x00\x00\x2f\x62\x69\x6e\x2f\x73\x68\x00\x57\x53"
buf += b"\x89\xe1\xcd\x80"
성공적으로 shellcode가 생성되는 것을 알 수 있다.
다음으로 찾아야하는 것은 s변수의 크기를 통해 dummy로 전달할 값의 크기를 구해야 한다.
Ebp-14에 변수 s가 위치하므로 크기는 20byte인 것을 알 수 있다. 또한 name함수의 시작 address 또한 아까 bss영역을 확인하는 과정에서 0x0804A060임을 확인 하였다. 따라서 결과적으로 전달할 payload는 아래와 같다
dummy*20byte + sfp*4byte + name의 시작 address
여기까지의 결론으로 exploit을 작성해보자.
성공적으로 shell을 획득하고 flag까지 출력할 수 있다.
'Wargmae > HackCTF' 카테고리의 다른 글
[Hack CTF – x64 Simple_size_BOF] (0) | 2021.01.05 |
---|---|
[Hack CTF – x64 Buffer Overflow] (0) | 2021.01.05 |
[Hack CTF - Baisc_FSB] (0) | 2021.01.03 |
[Hack CTF - Basic_BOF #2] (0) | 2021.01.02 |
[HackCTF - offset] (0) | 2021.01.02 |