pwnable新的一题。

download: http://pwnable.kr/bin/codemap.exe

ssh codemap@pwnable.kr -p2222 (pw:guest)

这道题虽然是在pwnable下,但是是一道逆向题。。。 //前web狗膜一发二进制大佬

根据提示,需要查看 0x403E65 运行时,寄存器 EAX,EBX 的内容。

先不考虑运行的内容,先看程序。首先这个程序没有加壳,直接可以用ida查看内容.

然后可以看到程序的框架,在main函数中,默默按下F5...

int __cdecl main(int argc, const char **argv, const char **envp)
{
int seed; // esi@3
int (***v4)(void); // eax@3
int (***v5)(void); // edi@3
int v6; // esi@4
int (**v7)(void); // eax@4
int (***random_funtion)(void); // ecx@5
unsigned int v9; // eax@8
unsigned int v10; // esi@8
char *eax_now_str; // ebx@8
unsigned int i; // esi@9
char *max_eax_str; // [sp+10h] [bp-60h]@0
unsigned int eax_now; // [sp+14h] [bp-5Ch]@8
unsigned int count; // [sp+18h] [bp-58h]@1
unsigned int max_eax; // [sp+1Ch] [bp-54h]@1
char word_str; // [sp+20h] [bp-50h]@9
int v19; // [sp+6Ch] [bp-4h]@3 printf("I will make 1000 heap chunks with random size\n");
printf("each heap chunk has a random string\n");
printf("press enter to start the memory allocation\n");
sub_3440B1();
max_eax = ;
count = ;
srand();
while ( )
{
seed = * rand() % ;
v4 = (int (***)(void))operator new(8u);
v5 = v4;
v19 = ;
if ( v4 )
{
*v4 = (int (**)(void))&off_34F2EC;
v6 = ( * seed >> ) + ;
v7 = (int (**)(void))operator new(8u);
if ( v7 )
{
v7[] = (int (*)(void))v6;
v5[] = v7;
random_funtion = v5;
}
else
{
v5[] = ;
random_funtion = v5;
}
}
else
{
random_funtion = ;
}
v19 = -;
v9 = (**random_funtion)();
v10 = v9 % 0x186A0;
eax_now = v9 % 0x186A0;
eax_now_str = (char *)malloc(v9 % 0x186A0);
if ( v10 >= 0x10 )
{
qmemcpy(&word_str, "abcdefghijklmnopqrstubwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 0x3Fu);
i = ;
do
eax_now_str[++i - ] = *(&word_str + rand() % );
while ( i < 0xF );
eax_now_str[] = ;
if ( eax_now > max_eax )
{
max_eax = eax_now;
max_eax_str = eax_now_str;
}
}
if ( ++count >= 0x3E8 ) // 0x3e8 = 1000
break;
srand(count);
}
printf("the allcated memory size of biggest chunk is %d byte\n", max_eax);
printf("the string inside that chunk is %s\n", max_eax_str);
printf("log in to pwnable.kr and anwer some question to get flag.\n");
sub_3440B1();
return ;
}

这是把F5以后的反编译程序,加上自己的理解改成了这个样子。

这个是一个循环申请内存空间,并随机填充16个a~Z0~9字符的程序,循环次数为1000次。

每次循环后,找到申请空间最大的那次,并打印出来。

上面最重要的是random_function变量,它的结果是下图这些sub_*的函数,内容就是根据现在的执行上下文生成一个随机数。

由于上面代码中用的随机函数都是伪随机,或者种子固定,因此,每次运行该程序,申请的大小、字符串的添加都是一样的。

而题目中给的提示,EAX、EBX是执行的结果,其中EAX存储的是申请内存的大小、EBX存储一个char指针,指向填充的字符串。

做了以上分析之后,可以想出解决思路,每次在该位置下断点,获取EAX、EBX的内容,最后做删选即可。

而通过服务器上所给的提示,随后需要提交第二、第三大分配内存块所填充的字符串内容。

由于做了1000次循环,因此人工寻找几乎不可能。

还好ida工具有ida 脚本这样一种工具,可以动态获取指定内容。

可以编写ida脚本来完成查找。我使用了IDA Python这一工具。其实和idc基本相同。

思路就是下断点——获取EAX\EBX的值,最终进行比较,由于没想到好的排序算法,就直接采用最简单粗暴的方法

脚本如下,另外每次程序加载到内存中的位置不同,使用时应修改添加断点的内存地址。

from idaapi import *
from idc import *
import os count = 0
eax_list = list()
ebx_list = list() try:
if debugger:
print("Removing previous hook ...")
debugger.unhook()
except:
pass
AddBpt (0x403e65)
print "[*] set hook OK...\n"
StartDebugger("","","")
for i in range(0,999):
GetDebuggerEvent(WFNE_SUSP|WFNE_CONT, -1)
print "[+]",i
eax = GetRegValue("EAX")
eax_list.append(eax)
ebx = GetRegValue("EBX")
ebx_list.append(ebx)
if i == 998:
print '[+] eax max : ',max(eax_list)
index = eax_list.index(max(eax_list))
a = ebx_list[index]
#message( "[+] ebx max : %x",%(ebx_list[eax_list.index(max(eax_list))]))
Message("%x"%a)
print "max",GetString(a)
del(eax_list[index])
del(ebx_list[index])
#
print '[+] eax second : ',max(eax_list)
index = eax_list.index(max(eax_list))
a = ebx_list[index]
#message( "[+] ebx max : %x",%(ebx_list[eax_list.index(max(eax_list))]))
Message("%x"%a)
print "second",GetString(a)
del(eax_list[index])
del(ebx_list[index])
#
print '[+] eax third : ',max(eax_list)
index = eax_list.index(max(eax_list))
a = ebx_list[index]
#message( "[+] ebx max : %x",%(ebx_list[eax_list.index(max(eax_list))]))
Message("%x"%a)
print "third",GetString(a)
del(eax_list[index])
del(ebx_list[index])

最终,运行的结果如下:

nc 0 9021输入字符串之后可以获得该题的flag:

【pwnable.kr】 codemap的更多相关文章

  1. 【pwnable.kr】 asm

    一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...

  2. 【pwnable.kr】 [simple login]

    Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...

  3. 【pwnable.kr】 brainfuck

    pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...

  4. 【pwnable.kr】 unlink

    pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...

  5. 【pwnable.kr】 memcpy

    pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...

  6. 【pwnable.kr】 uaf

    目测是比较接近pwnable的一道题.考察了uaf(use after free的内容),我觉得说白了就是指针没有初始化的问题. ssh uaf@pwnable.kr -p2222 (pw:guest ...

  7. 【pwnable.kr】input

    这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...

  8. 【pwnable.kr】cmd2

    这道题是上一个cmd1的升级版 ssh cmd2@pwnable.kr -p2222 (pw:mommy now I get what PATH environmentis for :)) 登录之后, ...

  9. 【pwnable.kr】cmd1

    最近的pwnable都是linux操作系统层面的. ssh cmd1@pwnable.kr -p2222 (pw:guest) 首先还是下载源代码: #include <stdio.h> ...

随机推荐

  1. 什么是Device ID?

    Android ID用于唯一识别一部设备的一次刷机行为,虽然不能完全确定该设备的唯一性(真的唯一性是用IMEI号的),但是可以很大程度上过滤重复设备.这是移动互联网广告行业的基础,尤其是CPI广告,设 ...

  2. free to monitor your sqlserver easy and safe and ...

    Unlike AWR in Oracle, Sqlserver does not have offical way to make history performance information fo ...

  3. redhat 7.6 配置repo源

    vi /etc/yum.repos.d/base.repo          #编辑配置repo配置文件,如果没有则自动创建,没有影响 name=base     //源名字,起什么名都没影响 bas ...

  4. 「luogu4135」作诗

    「luogu4135」作诗 传送门 分块好题. 预处理出 \(f[i][j]\) 表示 \(i\) 号块到 \(j\) 号块的答案,\(num[i][k]\) 表示 \(k\) 在前 \(i\) 块的 ...

  5. 上篇: php 微信公众号 基于Thinkphp3.2框架开发

    说明:本教程是自己自学+自己的理解+扩展(包括学习过程中遇到的一些问题) 参考教程:麦子学院--李忠益--http://www.maiziedu.com/u/70409/ 微盟: http://www ...

  6. hdu 1541 Stars 统计<=x的数有几个

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  7. 2_05_MSSQL课程_查询_where,group by,having的区别以及内连接、案例练习

    SQL查询顺序 select distinct/top ..._ (5) 投影 from_(1)找到表  where_ (2)过滤掉我们不需要的数据    group by_ (3)分组操作    h ...

  8. 移动硬盘在MAC找不着了

    原因: 移动硬盘,还没有推出的时候,我就直接拔了,导致文件被损坏了. 在MAC系统下,试了很多命令,一不小心加载上了. 但是只读模式,此时我想应该是有损坏了,系统也提示要重新格式化,这个代价太大了,里 ...

  9. Adroid ViewPage+GridView实现每页6个元素,三页滑动切换

    //}//public class MainActivity extends Activity {// private static final float APP_PAGE_SIZE = 16.0f ...

  10. Day9 - G - Doing Homework HDU - 1074

    有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分.求如何安排任务,使得扣的分数最少.Input有多组测试数据.第一行一个整数表示测试数据的组数第一行一个整数n(1<=n<= ...