day4

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()
原文地址:https://www.cnblogs.com/amlkhlwd33/p/9417030.html