pwnable新的一题。

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

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

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

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

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

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

  1. int __cdecl main(int argc, const char **argv, const char **envp)
  2. {
  3. int seed; // esi@3
  4. int (***v4)(void); // eax@3
  5. int (***v5)(void); // edi@3
  6. int v6; // esi@4
  7. int (**v7)(void); // eax@4
  8. int (***random_funtion)(void); // ecx@5
  9. unsigned int v9; // eax@8
  10. unsigned int v10; // esi@8
  11. char *eax_now_str; // ebx@8
  12. unsigned int i; // esi@9
  13. char *max_eax_str; // [sp+10h] [bp-60h]@0
  14. unsigned int eax_now; // [sp+14h] [bp-5Ch]@8
  15. unsigned int count; // [sp+18h] [bp-58h]@1
  16. unsigned int max_eax; // [sp+1Ch] [bp-54h]@1
  17. char word_str; // [sp+20h] [bp-50h]@9
  18. int v19; // [sp+6Ch] [bp-4h]@3
  19.  
  20. printf("I will make 1000 heap chunks with random size\n");
  21. printf("each heap chunk has a random string\n");
  22. printf("press enter to start the memory allocation\n");
  23. sub_3440B1();
  24. max_eax = ;
  25. count = ;
  26. srand();
  27. while ( )
  28. {
  29. seed = * rand() % ;
  30. v4 = (int (***)(void))operator new(8u);
  31. v5 = v4;
  32. v19 = ;
  33. if ( v4 )
  34. {
  35. *v4 = (int (**)(void))&off_34F2EC;
  36. v6 = ( * seed >> ) + ;
  37. v7 = (int (**)(void))operator new(8u);
  38. if ( v7 )
  39. {
  40. v7[] = (int (*)(void))v6;
  41. v5[] = v7;
  42. random_funtion = v5;
  43. }
  44. else
  45. {
  46. v5[] = ;
  47. random_funtion = v5;
  48. }
  49. }
  50. else
  51. {
  52. random_funtion = ;
  53. }
  54. v19 = -;
  55. v9 = (**random_funtion)();
  56. v10 = v9 % 0x186A0;
  57. eax_now = v9 % 0x186A0;
  58. eax_now_str = (char *)malloc(v9 % 0x186A0);
  59. if ( v10 >= 0x10 )
  60. {
  61. qmemcpy(&word_str, "abcdefghijklmnopqrstubwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890", 0x3Fu);
  62. i = ;
  63. do
  64. eax_now_str[++i - ] = *(&word_str + rand() % );
  65. while ( i < 0xF );
  66. eax_now_str[] = ;
  67. if ( eax_now > max_eax )
  68. {
  69. max_eax = eax_now;
  70. max_eax_str = eax_now_str;
  71. }
  72. }
  73. if ( ++count >= 0x3E8 ) // 0x3e8 = 1000
  74. break;
  75. srand(count);
  76. }
  77. printf("the allcated memory size of biggest chunk is %d byte\n", max_eax);
  78. printf("the string inside that chunk is %s\n", max_eax_str);
  79. printf("log in to pwnable.kr and anwer some question to get flag.\n");
  80. sub_3440B1();
  81. return ;
  82. }

这是把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的值,最终进行比较,由于没想到好的排序算法,就直接采用最简单粗暴的方法

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

  1. from idaapi import *
  2. from idc import *
  3. import os
  4.  
  5. count = 0
  6. eax_list = list()
  7. ebx_list = list()
  8.  
  9. try:
  10. if debugger:
  11. print("Removing previous hook ...")
  12. debugger.unhook()
  13. except:
  14. pass
  15. AddBpt (0x403e65)
  16. print "[*] set hook OK...\n"
  17. StartDebugger("","","")
  18. for i in range(0,999):
  19. GetDebuggerEvent(WFNE_SUSP|WFNE_CONT, -1)
  20. print "[+]",i
  21. eax = GetRegValue("EAX")
  22. eax_list.append(eax)
  23. ebx = GetRegValue("EBX")
  24. ebx_list.append(ebx)
  25. if i == 998:
  26. print '[+] eax max : ',max(eax_list)
  27. index = eax_list.index(max(eax_list))
  28. a = ebx_list[index]
  29. #message( "[+] ebx max : %x",%(ebx_list[eax_list.index(max(eax_list))]))
  30. Message("%x"%a)
  31. print "max",GetString(a)
  32. del(eax_list[index])
  33. del(ebx_list[index])
  34. #
  35. print '[+] eax second : ',max(eax_list)
  36. index = eax_list.index(max(eax_list))
  37. a = ebx_list[index]
  38. #message( "[+] ebx max : %x",%(ebx_list[eax_list.index(max(eax_list))]))
  39. Message("%x"%a)
  40. print "second",GetString(a)
  41. del(eax_list[index])
  42. del(ebx_list[index])
  43. #
  44. print '[+] eax third : ',max(eax_list)
  45. index = eax_list.index(max(eax_list))
  46. a = ebx_list[index]
  47. #message( "[+] ebx max : %x",%(ebx_list[eax_list.index(max(eax_list))]))
  48. Message("%x"%a)
  49. print "third",GetString(a)
  50. del(eax_list[index])
  51. 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. scrapy shell中遇到的坑

    如果直接scrapy shell +网址  然后发现返回200 但是request和response的网址不同,那么可以使用百度短网址 https://dwz.cn/ 进行缩短.这样一般就能解决问题

  2. SpringMVC配置没有任何问题根据请求却怎么都找不到映射(tomcat所导致的问题)

    本人在做SpringMVC练习的时候,配置文件反复检查了不下十几遍,没有任何问题,然后就招了个之前的项目的源码复制进去,原来的项目没有任何问题,这个项目却怎么都不能跳转路径,然后有找了一个Spring ...

  3. 哈希表,Java中的hashCode

    哈希表: 将我们所需的键通过哈希函数转换索引,然后存储在一个数组中. 哈希表是时间和空间之间的平衡,体现空间换时间的算法思想(联想到预加载,缓存等,有时候多存储,预处理缓存一些东西,带来时间复杂度的改 ...

  4. PaperReading20200226

    CanChen ggchen@mail.ustc.edu.cn   To share or not share Motivation: With the publiaction of NAS101, ...

  5. Django:使用django自带的登录模块登录后会默认登录到 /accounts/profile 下的问题

    django settings中LOGIN_REDIRECT_URL默认重定向到/accounts/profile下,可通过配置修改

  6. Linux centos7 日常运维——使用w查看系统负载、vmstat命令、top命令、sar命令、nload命令

    一.使用w查看系统负载 w .uptime查看系统负载,0.00表示1分钟之内负载为0 cat  /proc/cpuinfo查看cpu核数 二.vmstat命令,查看进程.cpu.memory.交换. ...

  7. 《C++ Primer(中文版)(第5版)》斯坦利·李普曼 (Stanley B. Lippman) (作者), 约瑟·拉乔伊 (Josee Lajoie) (作者), 芭芭拉·默 (Barbara E. Moo) (作者) azw3

    内容简介: 这本久负盛名的C++经典教程,时隔八年之久,终迎来的重大升级.除令全球无数程序员从中受益,甚至为之迷醉的——C++ 大师 Stanley B. Lippman 的丰富实践经验,C++标准委 ...

  8. 使用Linux命令修改数据库密码

    通过登录mysql系统,# mysql -uroot -pEnter password: [输入原来的密码]mysql>use mysql;mysql> update user set p ...

  9. Day3-G - Task HDU4864

    Today the company has m tasks to complete. The ith task need xi minutes to complete. Meanwhile, this ...

  10. Link Analysis_2_Application

    US Cities Distribution Network 1.1 Task Description Nodes: Cities with attributes (1) location, (2) ...