pwnable.kr-cmd2

题目描述: Daddy bought me a system command shell. but he put some filters to prevent me from playing with it without his permission… but I wanna play anytime I want! ssh [email protected] -p2222 (pw:flag of cmd1) 这题ssh的登陆密码是cmd1的flag,登陆后查看cmd2.c的源代码: 我们看到相比cmd1还多过滤了“/”,所以这里我们需要绕过这个限制,这里有多种方法可以绕过,经过测试我们发现通过cmd2中的system可以直接执行echo,但是其他的命令都需要绝对路径才行,也就是例如whoami需要”/bin/whoami”,这样会出现”/“。这里利用echo进行绕过: 把所有的字符经过8进制编码: 然后得到编码后的字符串,最后构造payload: [email protected]:~$ ./cmd2 ‘$(echo “\057\0142\0151\0156\057\0143\0141\0164\040\0146\0154\0141\0147”)’ $(echo “\057\0142\0151\0156\057\0143\0141\0164\040\0146\0154\0141\0147”) FuN_w1th_5h3ll_v4riabl3s_haha 可以成功得到flag: FuN_w1th_5h3ll_v4riabl3s_haha

pwnable.kr-cmd1

题目描述: Mommy! what is PATH environment in Linux? ssh [email protected] -p2222 (pw:guest) cmd1.c的源码为: 看起来过滤了flag,sh,tmp,没有关系,通过shell下面指令拼接可以绕过: “/bin/cat ‘fl”ag’” [email protected]:~$ ./cmd1 “/bin/cat ‘fl”ag’” mommy now I get what PATH environment is for 🙂 所以最终的flag为: mommy now I get what PATH environment is for 🙂   这里更新一种方法: [email protected]:~$ ls cmd1 cmd1.c flag [email protected]:~$ mkdir /tmp/cmd1 [email protected]:~$ cd /tmp/cmd1 [email protected]:/tmp/cmd1$ […]

pwnable.kr-lotto

题目描述: Mommy! I made a lotto program for my homework. do you want to play? ssh [email protected] -p2222 (pw:guest) 看下源码,是个简易的lotto系统,输入6个字符,与系统/dev/urandom生成的6个字符进行比较,如果相同的话就中奖了,但是在检查的地方代码出现了问题: 我们可以看到这里把输入的submit的每个字节都与生成的lotto的每个字节进行了比较,这里如果我们submit提交的都是同一个字节,只要lotto里面出现一次,match的值就为6,会成功返回flag,所以这里我们尝试每次都输入#######,也就是6个35: Submit your 6 lotto bytes : ###### Lotto Start! bad luck… – Select Menu – 1. Play Lotto 2. Help 3. Exit 1 Submit your 6 lotto bytes : ###### Lotto Start! bad luck… […]

pwnable.kr-blackjack

题目描述: Hey! check out this C implementation of blackjack game! I found it online * http://cboard.cprogramming.com/c-programming/114023-simple-blackjack-program.html I like to give my flags to millionares. how much money you got? Running at : nc pwnable.kr 9009 看了下源码,就是个blackjack(21点)游戏,本还以为是需要自己写个机器人,过关的要求的是millionaire(100万),结果黑盒就过了,过程很简单,在投注的时候输了一个很大的数,第一次没有通过,要求重新输入,然后再输一次,并赢了这局就可以了。 看下源码,很容易发现有问题的地方: 这里if应该改成while,如果是if的话,这里只做了一次验证,第二次输入的bet并没有验证: 这样成功获得了flag: YaY_I_AM_A_MILLIONARE_LOL Cash: $727380468 ——- |S | | 9 | | S| ——- Your Total is 9 […]

pwnable.kr-coin1

题目描述: Mommy, I wanna play a game! (if your network response time is too slow, try nc 0 9007 inside pwnable.kr server) Running at : nc pwnable.kr 9007 运行连接后发现是个小游戏: ————————————————— – Shall we play a game? – ————————————————— You have given some gold coins in your hand however, there is one counterfeit coin among them […]

pwnable.kr-shellshock

题目描述: Mommy, there was a shocking news about bash. I bet you already know, but lets just make it sure 🙂 ssh [email protected] -p2222 (pw:guest) shellshock.c的源码为: 顾名思义了,这题就是需要利用shellshock漏洞来获取flag,具体的讲解参见:http://www.myhack58.com/Article/html/3/62/2015/60779.htm 所以我们构造payload:export foo='() { :; }; cat flag‘直接获取flag,或者export foo='() { :; }; bash’切换成shellshock2用户的bash,然后再执行命令获取flag: [email protected]:/home/shellshock$ export foo='() { :; }; bash’ [email protected]:/home/shellshock$ ./shellshock [email protected]:/home/shellshock$ [email protected]:/home/shellshock$ [email protected]:/home/shellshock$ cat flag only if […]

pwnable.kr-mistake

题目描述: We all make mistakes, let’s move on. (don’t take this too seriously, no fancy hacking skill is required at all) This task is based on real event Thanks to dhmonkey hint : operator priority ssh [email protected] -p2222 (pw:guest) mistake.c的源码: 这里我们看看fd的值: 首先,当存在/home/mistake/passcode文件时,fd的返回值为0,而当fd为0时,根据pwnable.kr-fd 我们知道,read()函数第一个参数为0时,read的值来自stdin,也就是通过命令行输入,而不是本题源代码的意思,取自passcode文件,这样,答案我们就可控了。最后我们看到pw_buf和pw_buf2进行比较,如果相同的话,返回正确的flag。 pw_buf等于我们输入的内容,而pw_buf2等于pw_buf每一位的内容与1进行xor后的值,所以这里我们输入pw_buf为1111111111,pw_buf1为0000000000,即可获得flag: [email protected]:~$ ./mistake do not bruteforce… 1111111111 input password : 0000000000 Password OK […]

pwnable.kr-leg

题目描述: Daddy told me I should study arm. But I prefer to study my leg! Download : http://pwnable.kr/bin/leg.c Download : http://pwnable.kr/bin/leg.asm ssh [email protected] -p2222 (pw:guest) 这题的描述比较有意思,这题主要考察arm的汇编指令,当然此ARM非彼arm(胳膊),leg.c的代码: leg.asm的代码: 这题的代码其实很简单,我们输入的key,需要让他满足其值为key1(), key2(), key3()三个函数返回值的和,这里需要对三个函数分别进行分析: 首先是key1: Dump of assembler code for function key1: 0x00008cd4 <+0>: push {r11} ; (str r11, [sp, #-4]!) 0x00008cd8 <+4>: add r11, sp, #0 0x00008cdc <+8>: […]

pwnable.kr-input

题目描述: Mom? how can I pass my input to a computer program? ssh [email protected] -p2222 (pw:guest) 连接上ssh后,input.c的源码如下: 这题代码显而易见并没有需要溢出的地方,这里考察的是unix下的数据传输,我们分别看下5个stage。 Stage1 需要通过argv传递参数,由于这里需要满足argv[‘A’]=”\x00″ argv[‘B’]=”\x20\x0a\x0d”,这些都是不可见字符,并且是空字符以及回车换行符,所以这里不能够使用python通过命令行传递参数,这里使用C语言编写程序,通过子进程的方法调用input程序进行传参 Stage2 这里我们又遇到read函数了,在pwnable.kr的第一题中就涉及到:pwnable.kr-fd 当fd为0时,为stdin ,fd为1时,为stdout,fd为2时,为stderr, 所以这里我们使用fork创建子进程,pipe进行管道传输,具体见下面的代码 Stage3 stage3使用env传递参数,env是标准main函数三个参数中的一个,它的值是系统环境变量,默认是不需要填写的。这里我们需要通过设定env=”\xde\xad\xbe\xef=\xca\xfe\xba\xbe” ,然后通过execve(“/root/Desktop/input”, argv, env);进行传递 Stage4 需要在文件名为”\x0a“的文件中读取字符,判断是否为”\x00\x00\x00\x00″,这里直接把源代码中的读取文件改成写文件就可以了: Stage5 socket编程,同样和4一样,只要把接受改成发送就可以了,这里需要注意的是socket的端口是通过argv[‘C’]来控制的,所以我们需要设置好argv[‘C’],然后在执行第五部之前需要有一个延时,因为这里我们需要时间完成第四部不同进程间的通信: 所以最后的代码为: 这里不要忘了添加文件头,然后我们把代码放到pwnable.kr服务器上的/tmp/input目录,由于目录下并没有flag,我们执行ln /home/input/flag flag,把flag重定向到当前目录下,最后编译运行得到flag: Just give me correct inputs then you will get the flag 🙂 Stage 1 clear! Stage […]

pwnable.kr-random

题目描述: Daddy, teach me how to use random value in programming! ssh [email protected] -p2222 (pw:guest) 其中random.c的代码为: 代码很简单,一开始以为是需要通过key溢出覆盖random的值,结果经过调试发现每次random()生成的数值是固定的,因为在本题的代码中并没有制定随机数种子(seed),导致每次生成的第一个数都是固定的。 第一个数为:0x6b8b456,最后的结果要求是(key ^ random) == 0xdeadbeef, 所以key的值应该为:0xdeadbeef^0x6b8b4567=3039230856 输入之后,获得flag: [email protected]:~$ ./random 3039230856 Good! Mommy, I thought libc random is unpredictable… 所以flag为: Mommy, I thought libc random is unpredictable…