이전 문제와 비슷하다
#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;
}
코드 분석
다른 점이 있다면 이번엔 exit함수가 없다
또, sprintf함수를 이용해서 stack_buf에 heap_buf에 입력 받은 값을 덮어 출력 시켜주고 있다
즉, sprintf가 실행되며 fsb가 발생한다
printf의 got값을 덮어서 get_shell을 실행 시킬 수 있다
처음에 main의 ret값을 덮으려 했는데 이건 안 되는 거 같다
정보수집
get_shell : 0x08048669
printf_got : 0x0804a010
시나리오
이전 문제처럼 0x0804a010에 %n을 이용해서 0x08048669를 덮어 씌울라 했으나 세그먼트 폴트로 프로그램이 강제종료 된다
별로 고민 안하고 (이러면 안 되는데)
질문창에서 힌트를 얻었다 ㅋ
sprintf에서 stack_buf에 할당된 값이 얼마 안 돼서 그 값을 초과하는 값을 출력 시키기 때문에 세그먼트 폴트가 발생하는 것이었다
따라서 0x80 안으로 출력 시켜줘야 하고 그 안에서 변조가 이루어져야 한다
printf_got : 0x0804a010, get_shell : 0x08048669
자세히 보면 두 주소는 하위 2바이트값만 다르기때문에 하위 2바이트 값만 바꿔주면 된다
최종 페이로드
'System Hacking' 카테고리의 다른 글
[Dreamhack] Tcache Poisoning 풀이 - 티스토리 (0) | 2023.08.17 |
---|---|
[Dreamhack] uaf_overwrite 풀이 - 티스토리 (0) | 2023.08.08 |
[Dreamhack] basic_exploitation_002 풀이 - 티스토리 (0) | 2023.08.02 |
[Dreamhack] out_of_bound 풀이 - 티스토리 (0) | 2023.07.29 |
[드림핵] hook (hook overwrite) 풀이 - 티스토리 (0) | 2023.07.28 |