Execute
문제로 주어진 bof_baasic2파일을 실행하면 입력을 받고 뭔가 알 수 없는 값들을 출력해주고 프로그램이 종료된다. 정확히 어떤 값을 입력하고 출력하는 것 인지 확인 하기위해 IDA에 올려 프로그램을 분석해보자
Analyze
해당 프로그램에 걸려있는 보호기법은 아래와 같다. Nxbit만 걸려있는 것을 확인 할 수 있다.
Main
- Line 6 : 포인터 변수인 v5에 sup함수의 시작주소를 대입해준다.
- Line 7 : fgets함수로 변수 s에 133byte만큼 입력을 받는다.
- Line 8 : v5변수에 들어있는 함수(sup)를 실행 시킨다.
sup
puts함수를 이용해 s변수의 주소를 출력한다. 앞서 입력했을때 출력되는 알 수 없는 값은 위 코드로 인해 실행되는것 같다.
Shell
쉘을 실행 시켜준다.
main함수에서 함수 포인터인 v5에 sup의 주소를 대입해주는데 만약 buffer overflow를 통해 v5에 shell함수의 주소를 덮어쓸 수 있다면 성공적으로 shell을 획득 할 수 있을 것이다.
Solve
먼저 buffer overflow를 트리거 하기위해 필요한 dummy의 길이를 계산 해야 한다. s변수와 v5변수 사이거리를 계산해보자.
s변수의 경우 ebp-8C의 위치에 v5의 경우 ebp-C에 위치한다. 둘 사이의 거리를 계산해주면 0x80이 계산된다. 따라서 0x80만큼의 dummy에 shell함수의 주소 값을 붙여주면 문제를 해결 할 수 있을 것이다.
shell함수의 주소는 아래와 같다.
따라서 payload는 dummy*0x80 + p32(0x0804849B)의 형태가 될것이다. 여기까지의 결론을 가지고 pwntools를 이용해 exploit을 작성해보자.
성공적으로 shell을 얻어 flag를 출력할 수 있다.
'Wargmae > HackCTF' 카테고리의 다른 글
[Hack CTF – x64 Buffer Overflow] (0) | 2021.01.05 |
---|---|
[Hack CTF – 내 버퍼가 흘러넘친다!!!] (1) | 2021.01.03 |
[Hack CTF - Baisc_FSB] (0) | 2021.01.03 |
[HackCTF - offset] (0) | 2021.01.02 |
[Hack CTF - Basic_BOF # 1] (0) | 2021.01.02 |