#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;
}
위 코드는 문제에서 주어진 코드이다. 코드를 요약하면 read_str로 이름을 20바이트 크기만큼 입력받고 name 배열의 index 20에 '\0'을 삽입한다. 따라서 20바이트 크기를 초과하여 한 바이트를 오염시킬 수 있다.
위 gdb main 함수 결과는 main 함수의 name배열과 age변수를 어셈블리로 분석한 것이다. sub sep,0x18을 통해 name 변수는 ebp와 24만큼 떨어져 있고 바로 아래 ebp-0x4에 1을 저장하므로 ebp-0x4가 age변수의 주소 임을 알 수 있다. 따라서 name 배열과 age 변수의 차이는 20바이트이고 read로 name 배열을 20바이트 만큼 채우면 21번째에 '\0'을 추가하므로 age가 0으로 덮어씌워진다. age가 0이면 get_shell()이 실행되므로 쉘을 획득할 수 있다.
'시스템 해킹 > 드림핵' 카테고리의 다른 글
[Dreamhack] basic_exploitation_003 (0) | 2021.05.22 |
---|---|
[Dreamhack] oneshot (0) | 2021.05.11 |
[Dreamhack] basic_rop_x64 (0) | 2021.05.05 |
[Dreamhack] basic_rop_x86 (1) | 2021.05.03 |
[Dreamhack] off_by_one_000 (0) | 2021.04.18 |
댓글