[原创]【CTF-PWN】pwnable.tw_dubblesort
pwnable.tw_challenge_dubblesort
首先运行一下大概了解程序的流程:
运行结果 What your name :kirin Hello kirin ??/,How many numbers do you what to sort :3 Enter the 0 number : 4 Enter the 1 number : 5 Enter the 2 number : 6 Processing...... Result : 4 5 6
首先是传入一个name
而后需要我们指出需要排序的数字个数
而后需要我们依次输入需要排序的数字
最后程序给出排序好的result
不过这里发现一个问题,有些名字后存在其他字符(类似乱码)
猜测这里应该是字符串00结尾没有处理好而泄露了名字后的部分数据
先记下这个问题
下面载入IDA分析:
0x01 main
push ebp mov ebp, esp push edi push esi push ebx and esp, 0FFFFFFF0h add esp, 0FFFFFF80h call sub_5662B750 add ebx, 15CCh mov eax, large gs:14h mov [esp+7Ch], eax xor eax, eax call sub_5662B8B5
可以看出这里:
开启了canary保护:mov eax, large gs:14h 调用了一个sub_5662B8B5函数(一个计时器) 可以直接绕过这个计时器来动态分析: call sub_5662B8B5改为nop 或者:在call地址后的首句push ebp改为retn 或者:类似方法去除程序对alarm/signal的调用 或者:直接改变alarm的参数(加长时间) 或者:调试到alarm时set新的ip跳过call alarm 在gdb中可以忽略中间信号来绕过计时器: i handle SIGALRM handle SIGALRM nopass
下面:
输出"What your name :":
.text:5662B9EB lea eax, (aWhatYourName - 5662CFA0h)[ebx] ; "What your name :" .text:5662B9F1 mov [esp+4], eax .text:5662B9F5 mov dword ptr [esp], 1 .text:5662B9FC call ___printf_chk
从输入流读入0x40长度(输入流结尾自动停止读入)的字节到esp+8Ch+buf处:
.text:5662BA01 mov dword ptr [esp+8], 40h ; '@' ; nbytes .text:5662BA09 lea esi, [esp+8Ch+buf] .text:5662BA0D mov [esp+4], esi ; buf .text:5662BA11 mov dword ptr [esp], 0 ; fd .text:5662BA18 call _read
输出"Hello %s,How many numbers do you what to sort :":
mov [esp+8], esi lea eax, (aHelloSHowManyN - 5662CFA0h)[ebx] ; "Hello %s,How many numbers do you what t"... mov [esp+4], eax mov dword ptr [esp], 1 call ___printf_chk
使用scanf读入一个unsigned型数(所需排序个数):
.text:5662BA37 lea eax, [esp+18h] .text:5662BA3B mov [esp+4], eax .text:5662BA3F lea eax, (aU - 5662CFA0h)[ebx] ; "%u" .text:5662BA45 mov [esp], eax .text:5662BA48 call ___isoc99_scanf
接下来再调用scanf读入相应个数的unsigned并调用一个冒泡排序:sub_5662B931
最终输出结果
0x02 漏洞
0x01 字符串结尾\x00截断问题
首先就是开始时候的name可以泄露栈内数据:
当我们输入:"aaaa"
程序输出:

看一下栈内数据:

可以看到buff内数据是aaaa+'\n',而后面没有对字符串结尾加上00进行截断,导致后面的FFBA4B00上的数据在换行之后也输出了,直到遇到FFBA4804处的"\x00"
0x02 scanf读取unsigned数时非法字符问题
测试代码:
#include<stdio.h>
int main()
{int i;
while(~scanf("%u",&i))
printf("%u\n",i);
}
当输入一个非法字符时,其可能会因输入流问题直接输出栈上数据:
当输入"+-"这类数字本身中就有("+-"代表正负)的字符,则输出栈上数据 + 32764 - 32764 当输入"abc......"这类非法字符,因为输入流问题,这里没有成功scanf,便不断printf数据 a 32764 32764 32764 32764 .......
在程序中测试:
./dubblesort What your name :kirin Hello kirin ??/,How many numbers do you what to sort :5 Enter the 0 number : + Enter the 1 number : + Enter the 2 number : + Enter the 3 number : + Enter the 4 number : + Processing...... Result : 0 1 12779520 4158922506 4291112735
我们输入前栈中v13(保存需要排序的数字)处的数据分布:

注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
复制成功
