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. Linux下安装Docker,报错docker: unrecognized service的两种解决方案

    转自(方法1):https://www.cnblogs.com/ECJTUACM-873284962/p/9362840.html

  2. Day11 - H - Euclid's Game HDU - 1525

    Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtra ...

  3. 记录一次Nginx使用第三方模块fair导致的线上故障排错

    一.问题 今天发现有一台服务器的内存飙升,然后有预警,立即排查,发现该服务内存使用达到了 2G ,询问开发,当天是否有活动,被告知没有,登陆 Pinpoint 发现该服务是有两台机器,并且所有的访问都 ...

  4. excel2003 颜色筛选问题

    "excel2003中,添加辅助列,用定义名称的方法得到对应的颜色号,然后对辅助列进行排序: 颜色单元格在A列,选中B1,插入->名称->定义,输入a,下面输入公式 =get.c ...

  5. java 外卖店优先级

    [问题描述] “饱了么”外卖系统中维护着 N 家外卖店,编号 1 ∼ N.每家外卖店都有 一个优先级,初始时 (0 时刻) 优先级都为 0. 每经过 1 个时间单位,如果外卖店没有订单,则优先级会减少 ...

  6. 【随缘更(gu)】牛客D4简要思路(没有题解)

    T1 当然不能枚举每个区间,于是我们考虑算贡献. 对于每个位置i,我们计算其作为区间内第一个出现ai的位置的区间总数,则有ans=sigma( i - last[i] ) * ( n - i + 1 ...

  7. Day3-I-Squares POJ2002

      A square is a 4-sided polygon whose sides have equal length and adjacent sides form 90-degree angl ...

  8. Linux下四种安装软件方式

    1.yum源安装 可以解决依赖关系,但不确定安装的位置 2.rpm 基础安装 要自己解决依赖问题 rpm -ivh 安装 rpm -uvh 更新 rpm -e --nodeps 卸载    取消依赖 ...

  9. Mybatis注解开发单表CRUD

    Mybatis注解开发单表CRUD mybatis注解开发和xml开发不可兼容,要么全部使用注解,要么全部使用xml,个人建议注解,简单. 当实体类属性名称和数据库表属性名称一致时:无需配置Resul ...

  10. Jmeter - Linux 下面执行jmeter-server的时候出现:An error occurred: Cannot start. localhost is a loopback address.错误

    Jmeter - Linux 下面执行jmeter-server的时候出现:An error occurred: Cannot start. localhost is a loopback addre ...