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. Python 基础之python运算符

    一.运算符 1.算数运算符 + - * / // % ** var1 = 5var2 = 8 #(1)  + 加res = var1 + var2print(res) # (2)  -  减res = ...

  2. 再论谭浩强《C语言程序设计》

    一些同学学不好C语言,把罪责归于“因为教材是谭浩强写的”实在是很滑稽. 谭浩强老先生 1934 年生,现在已经 80 岁了.他 1958 年从清华大学自动控制系毕业,那年 24 岁.要知道 C 语言那 ...

  3. 2018 蓝桥杯省赛 B 组模拟赛

    C. 结果填空:U型数字 最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212 就是一个U型数字,但是 333, 98, 567, 3131,就是 ...

  4. docker-构建建tomcat镜像并启动容器

    1.下载一个tomcat8,解压好改名为tomcat并配置端口为80,删除webapps下的默认的应用,修改tomcat/bin目录下脚本的权限,chmod +x *.sh 2.路径一般放在/usr/ ...

  5. CXL联盟正式成立:成员均是行业巨头

    导读 今天,阿里巴巴.思科.戴尔EMC.Facebook.Google.HPE.华为.Intel.微软(按英文首字母排序)联合宣布,CXL联盟(Compute Express Link Consort ...

  6. 第1节 storm编程:9、storm与kafka的整合

    详见代码. 下图,为设置kafka的首次消费策略,即首次消费的偏移量的示例:

  7. hdfs的bug纪录, Unexpected block state

      今早遇到一个bug,提交 spark job 失败.说 hdfs 在 safe mode状态,不允许创建和删除文件. 然后发现 hdfs 的日志文件不断滚动,几乎每秒钟100M的速度打日志,当时没 ...

  8. uWSGI, Thread, time.sleep 使用问题

    下面的问题,在flask程序独立运行中,都没有问题,但是部署在 uwsgi 上表现异常: 1. 在http请求处理过程中,产出异步线程,放在线程池中,线程的启动时间有比较明显的延迟. 2. 在异步线程 ...

  9. 单元测试框架TestNg使用总结

    工欲善其事,必先利其器 单元测试的重要性是不言而喻的.但如果没有好的单元测试工具,是无法激起开发人员的欲望. Testng便是利器之一.TestNG是基于Annotation的测试框架的先驱,他拥有通 ...

  10. SIAMATIC S7-1200 中通过 Modbus RTU 如何读取地址范围 9999 到 65535 的输入字

    原文地址 说明 除了需要 STEP 7 >= V13 SP1 (TIA Portal) 的软件,还需要 S7-1200 CPU 固件版本 >= V4 (文章编号: 6ES721x-1xx4 ...