18.9.18 pwnable.kr----passcode - 10 pt

这题有C的源码,直接gcc运行后,拖进IDA分析一下到底出了什么问题

但是并看不出什么,打算用gdb动态看一下

因为看C的源码感觉没什么问题,可能是ebp覆盖报错什么的,我就在两个函数前都设置的断点

因为login中scanf没有用取地址,所以会直接读取当前栈,从而有危险性

welcome中的参数name所处位置是ebp-70,在IDA里面也可以看到,name参数所占的空间一共是96个字节(0x70-0x10)

但是我们要输入100个字节,那么多出来的四个字节就会被login函数使用,但是因为只能输入100个字节第二个password就无法输入,咋办,根据大佬的说法,是根据plt和got表完成的

大家可以看到printf函数执行时有个plt

百度搜了一下这是啥:

程序编译时会采用两种表进行辅助,一个为PLT表,一个为GOT表,PLT表可以称为内部函数表,GOT表为全局函数表,这两个表是相对应的,什么叫做相对应呢,PLT表中的数据就是GOT表中的一个地址

所以就是说是函数的地址

那么我们栈不够的问题就解决了,我们把剩下的字节改为printf的地址,之后在直接加上关键的系统命令就好了,这样当login的scanf函数调用时,调用的是printf的函数,之后就会把系统命令输出了,bingo

找一下printf的got表地址,直接objdump -R passcode 看函数表就好了

感觉方法是对的,但是就是不奏效,我后来参考了一下别人的做法,发现唯一的区别就是编译后的地址偏移不同,我又重新远程下载了文件,特地学了一下

#coding=utf-8
from pwn import *
import struct
addr = 0x0804a00                  #printf_address
shellcode = 'a'*96 +p32(addr)+'134514147'

conn=remote('143.248.249.64',22)
conn.sendline(shellcode)
conn.interactiv

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值