【pwnable.kr】 codemap
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的更多相关文章
- 【pwnable.kr】 asm
一道写shellcode的题目, #include <stdio.h> #include <string.h> #include <stdlib.h> #inclu ...
- 【pwnable.kr】 [simple login]
Download : http://pwnable.kr/bin/login Running at : nc pwnable.kr 9003 先看看ida里面的逻辑. 比较重要的信息时input变量再 ...
- 【pwnable.kr】 brainfuck
pwnable.kr第二关第一题: ========================================= Download : http://pwnable.kr/bin/bfDownl ...
- 【pwnable.kr】 unlink
pwnable.kr 第一阶段的最后一题! 这道题目就是堆溢出的经典利用题目,不过是把堆块的分配与释放操作用C++重新写了一遍,可参考<C和C++安全编码一书>//不是广告 #includ ...
- 【pwnable.kr】 memcpy
pwnable的新一题,和堆分配相关. http://pwnable.kr/bin/memcpy.c ssh memcpy@pwnable.kr -p2222 (pw:guest) 我觉得主要考察的是 ...
- 【pwnable.kr】 uaf
目测是比较接近pwnable的一道题.考察了uaf(use after free的内容),我觉得说白了就是指针没有初始化的问题. ssh uaf@pwnable.kr -p2222 (pw:guest ...
- 【pwnable.kr】input
这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...
- 【pwnable.kr】cmd2
这道题是上一个cmd1的升级版 ssh cmd2@pwnable.kr -p2222 (pw:mommy now I get what PATH environmentis for :)) 登录之后, ...
- 【pwnable.kr】cmd1
最近的pwnable都是linux操作系统层面的. ssh cmd1@pwnable.kr -p2222 (pw:guest) 首先还是下载源代码: #include <stdio.h> ...
随机推荐
- Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离.
- 8年经验面试官详解 Java 面试秘诀
作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三 ...
- 获取SDWebImage的缓存大小并清除
// 获取SDWebImage的缓存大小 - (NSString *)cacheSizeFormat { NSString *sizeUnitString; float size = [SDWebIm ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:除了屏幕阅读器外,其他设备上隐藏元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- C# Connection:连接数据库---转载
C# 语言中 Connection 类是 ADO.NET 组件连接数据库时第一个要使用的类,也是通过编程访问数据库的第一步. 接下来我们来了解一下 Connection 类中的常用属性和方法,以及如何 ...
- BEC合约整数溢出漏洞还原与分析
一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...
- ExpandableListActivity
main.xml: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:an ...
- C 常用库函数memset,编译器宏定义assert
一. 总览 1.1库函数 函数名 头文件 功能 原型 说明 syslog syslog.h 记录至系统记录(日志) void syslog(int, const char *, ...) __p ...
- java string常用的占位符形式
自己在这里总结了三种占位符形式:看下面代码即可 String stringFormat = "lexical error at position %s, encountered % ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:自适应大小的按钮组
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...