额,鸽了好久,因为这几天在将之前学的来做题总结和应用一下,发现学了和没学差不多,很难受就。
BUUCTF get_started_3dsctf_2016
1.直接进入from pwn import *,然后elf = ELF(“get_started_3dsctf_2016”),直接显示是32位的,且打开了NX,表示代码数据段的执行和写入权限不能同时开启。
2.拖入IDA pro,妈呀,好简单的源码,直接gets(v4),有栈溢出的漏洞啊这是。发现v4到ebp的距离为0x38.又在ida左侧的函数名中发现了get_flag函数.
到这里我其实就被卡住了,看了网上的wp,又自己研究了好久。下面我来写下自己的理解。
3.用mprotect来改变一个地址(我们暂时称这个地址位start)的权限,让其变成可读可写可执行,然后利用read函数的读取功能,再将ip返回到start这个地址就的目的是执行这段shellcode来获取shell,然后再构建一个payload2 就是自动生成一个shellcode,就可以拿到shell了。
4.因为mprotect和read都需要参数,我们利用完参数之后,需要将他们pop出来,所以需要用pop pop pop ret来使程序的执行进行下去,第一个ret是将ip置为read函数的地址,而第二个ret是将程序执行流转到start这个地址处,这样才能向其中传入shellcode啊。
5.栈中的情况请看图,画的很乱,请见谅,我会尽量换一个做图软件的。
右侧的read_addr是我一开始忘记画上去了(呜呜),后来又补上了。嘿嘿