动态调试工具的使用
做了这么久的pwn之后又得兼顾一下re了哈哈哈。废话不多说,这周学了动态调试器的使用,并且轻松解出了那几道题目。
linux下的动态调试器都知道,gdb永远的神,windows的动态调试器就比较各色了,ollydbg,x32dbg,x64dbg。这里我用的是后两个调试器,ollydbg听师傅们说是不更新了还是咋地也不知道,所以就用了x32和x64dbg,其实看了一下界面都差不多的。
动态调试注意的就是下断点,改值这一系列操作,让程序按照你想的执行。比如有一个函数就是直接输出flag,但是它直接又没有完全直接给你,那怎么办?我直接改eip去执行那个函数不就ok了?与pwn不一样,pwn我要通过漏洞去执行,这个的话文件控制权限和这台计算机的权限全部在我手上,它怎么运行我说的算,对不对?那么接下来看几道例题,这个不是说只有动调能做,但是会动调一定比不会的占优势,这是真的。
xctf-game下载文件并且根据它的描述可以看到是一个32位PE文件且是一个类似游戏的程序,逻辑很简单,输入序列然后通过它函数的判断就可以让程序输出flag。但是
这个函数不仅复杂,直接从这里破解可以但是比较难,要 ...
ret2libc实战
ret2libc是一个pwner必备的基础知识。
ret2libc为 return to libc的缩写,我们需要执行libc函数里面的system("/bin/sh")
下面为32位程序并且带.so文件的题目:buuctfOGeek2019]babyrop
[OGeek2019]babyrop下载两个文件先丢进IDA里面
首先是pwn.elf
shift+F12查看字符串,看到比较有用的就是那个Correct\n但是这个不是逆向题,不用从结果分析,所以这个也是没什么用的,只能等会分析没有看到这个的时候再去整这个。然后也没有看到/bin/sh字符串,那么我们就先放弃字符串入手了。
查看main的伪C代码,得到
1234567891011121314int __cdecl main(){ int buf; // [esp+4h] [ebp-14h] BYREF char v2; // [esp+Bh] [ebp-Dh] int fd; // [esp+Ch] [ebp-Ch] sub_80486BB(); fd = open("/de ...
archlab实验报告:y86命令使用
下载文件之后:
脑瓜子嗡嗡的,writeup看不懂,只能先去看看已有的实验报告,然后先做个总结——
先把里面的sim.tar解压了,然后进入目录之后make clean,make会在里面的所有文件该生成的文件生成了。
part A这个部分的文件全在misc文件夹。
意思大概是用y86指令集实现example.c文件里面的三个函数,那也太棒了呀,我最擅长手写汇编了,汇编它虽然码起来效率低,但是能直接对底层进行操作,想想都激动awa
要用到的指令:
12./yis xxx.ys ./yas xxx.yo
第一条可以理解为汇编,第二条可以理解为链接且运行。
sum_list12345678910/* sum_list - Sum the elements of a linked list */long sum_list(list_ptr ls){ long val = 0; while (ls) { val += ls->val; ls = ls->next; } return val; ...
RSA解密
RSA解密简介:RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的 。(from 百度百科)
非对称加密我们平时学习的加密多是对称加密,非对称加密相比于对称加密的区别就是:加密和解密用的不是同一个密钥。假如Alice和Bob想在一个不安全的线路上通信,他们在用这个信息交流之前没有任何py的信息(即:他们一开始不存在有且仅有他们两个人知道的信息),而在这条线路上通信的所有信息都会被第三方窃听者Eve所获得。问:如何不让窃听者Eve监听到Alice和Bob的对话?
当然我们必须对发送的信息进行加密,而对称加密必须两人提前获取密钥和加密方式,这些信息都是他们一开始所不知道的,因此需要在这条线路上告知密钥和加密方式,如果在这条线路上告知,那么Eve也能对加密的数据解密从而监听他们的通话内容,那么我们采取非对称加密是最保险的。我只告诉你怎么加密,解密的密钥我自己留着,由于Eve不清楚解密方式自然就无法获取信 ...
红帽杯2019 easyRe
pwn题做完re题当然也不能少,buu上除了那些水题,开始做一些带点技术含量的题目了。
红帽杯2019的easyRE上来就是800KB的elf文件,看起来就很有技术含量的样子。其实看到大文件不用怕,函数多也不用怕,因为需要分析的函数一定只有几个,如果你点进去调用了大部分你没见过的函数,还有十分复杂的goto关系,那么这个函数你可以直接当他不存在,这是我自己得到的一个结论,不一定对,但是可以应付大部分的题目。废话不多说进入正题:buuctf 2019红帽杯easyRE
所有二进制安全相关的题目字符串一定是切入点,因为它可读。做pwn题你就找flag,bin/sh,当然这是签到-难度的题目才会有的字符串。做逆向题的话,看到很长的64位或者65位大小写字母和数字和一些其它字符组成的表,那么直接考虑base64,然后就是一些带flag的字符串或者是什么right,correct,congratulate之类判断正误的话,那么多半也是以调用这个字符串的函数为中心去分析。好的,打开先看一下,看到有很多很多的函数,先不慌(实则慌的一批),冷静地先摁一个shift+F12查看字符串。
一眼就可以 ...
ret2libc学习报告
在做pwn题的时候,我们会想尽一切办法执行函数system("/bin/sh"),那么执行这个需要两点:
1.找到system()函数。
2.找到"/bin/sh"字符串。
level0:have everything这个情况在简单比赛的签到题估计都出不了了,在溢出点写上system()的地址,若是32位则隔四字节往后填充"/bin/sh"字符串就行了。如果是64位的那么找到pop %rdi ret的gadgets在返回地址填上,并且后面堆上"/bin/sh"的地址和system()的地址即可成功
level1:without “bin/sh”在一个地方写上"bin/sh"然后溢出的时候传参就行了。如果没开启ASLR那么可以直接往栈上写,如果开了那你只能往.bss段去写,其实写好后跟level0差不多,也不多赘述。
level9999:have nothing哇,这个难度我觉得真的是上升了不少档次,所以给个9999级我觉得不过分。
啥都没有的情况就要往libc里面去找sys ...
canary保护学习报告:通过字符串泄露canary
这几天一直在跟着团队的进度做csapp的实验报告,突然想拿题来练手了才发现自己还是有点菜的。这次的任务是做一道简简单单的带canary保护的一题,做了很长时间问了很多师傅,也算把这个方法搞搞明白了,但是不确定能不能完全说的明白,那么下面就开始吧。
canary保护canary就是一段简简单单的cookie,它一般在上个函数所保存的ebp之前(即靠近栈顶的那个方向)下面一个图能描述一个带canary保护的栈帧,应该还是比较清楚的。
1234567891011↑栈顶buf//函数的缓冲区,一般用于保存局部变量canaryebp//上一个函数保存的ebpeip//返回地址argument 1argument 2argument 3......↓栈底
如果企图用大量数据覆盖缓冲区并且修改返回地址的数据达到劫持eip的目的那么就会修改canary的值,那么在返回的时候检测到canary的值发生改变后就会直接抛出异常并且停止执行程序。并且每次canary的值都是随机的,普通方法几乎是突破不了的。但是我们可以先想办法泄露canary的值,然后再把canary插入到payload当中,这样的话, ...
bufblab实验报告:32位程序缓冲区溢出攻击
缓冲区溢出攻击的实验
在此实验开始之前,弄清楚给你的三个文件分别干嘛的。
bufbomb:实验需要攻击的程序
hex2raw:根据填写的字节生成攻击字符串
makecookie:对每个实验用户生成一个八位十六进制的字节序列,用于识别用户。(可能是用来打分的)
在gdb要运行的时候,一定要输入r -u <your id>,终端运行要输入./bufbomb -u <your id>,否则你是运行不了的。那咱们先输入./makecookie -q生成你的cookie(id),最好先找个地儿保存一下。
作者在这里赞美一下这本书的编者:csapp的所有实验设计简直不要太好,学习计算机系统本是一个很枯燥的学习过程,但是这里的实验最大程度激发学生学习的兴趣。同时也希望国内的编者能够借鉴这本书的巧妙之处,让国内出越来越多的优秀教材。(由于本人表达能力不够,也只能这么夸了qwq)
level0:Candle这一堆英文我反正也看不来qwq,既然是level0不妨问题想简单一点:给了我test()函数,调用了一个getbuf(),而后又有一个gets()危险函数,又给了一个Smo ...
attacklab实验报告:代码注入以及rop攻击
今天来康康attack lab啊
Ctargetlevel1题目给出函数test,test里面有函数getbuf,然后它给定的提权函数是touch1(),我们那我们先gdb ctarget进入调试,然后输入disassemble getbuf查看汇编代码。
可以很清楚的看到函数的缓冲区大小是0x28字节,然后gets已经说明是库的标准函数了,gets函数是有漏洞的,它在读入字符串的时候不会对长度检测,而是给多少读多少。那么我们可以用这个gets来实现栈溢出,执行我们的权限函数touch1(),我们可以先用00字节填充40个字节,然后再加上shell函数的地址。注意前面可以用除了0a的任意字节填充,因为0a代表’\n’的意思,gets函数一旦读到这个字符就会认为字符串读取结束了。我们用print touch1去查看该函数的地址。
发现了提权函数的地址之后我们就可以构造payload了。我们先q退出gdb,然后这里先创建一个文本文件vim attack1.txt 然后填充
12345600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0 ...
bomblab实验报告:二进制安全与逆向分析
二进制逆向分析的实验
先观察给的.c文件,发现是要输入六组语句并且判断正误的,并且很容易发现判断函数phase_i(i=1,2…6)要有一个错误,炸弹即爆炸,那我们就要用到gdb调试了,在终端输入gdb bomb进入调试
phase_1首先在phase_1处断点(命令:b phase_1)找到phase_1的拆弹语句。然后r运行,先随便输入点东西这里我输入了很多a,断在该处之后单步调试,因为要进入函数内部,我们用命令step或者s进行单步调试。调试发现一个strings_not_equal函数,跟进去看发现寄存器rdi为我们输入的很多个a,而寄存器rsi已经有了一句话。
那么能直接断定这个就是我们的拆弹语句,重新调试进去输入那个语句Border relations with Canada have never been better.发现成功拆掉了这个炸弹,那么phase_1就拆掉了。
phase_2拆完了之后就看向phase_2,我们先delete 清除所有断点然后b phase_2新增断点,r之后先输入之前的拆弹语句来到phase_2,我们照例输入很多的a,s ...