欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]【CTF-PWN】pwnable.tw_dubblesort

[原创]【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。

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

0 0 0 举报
复制成功