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…

pwnable.kr-passcode

依然是题目描述: Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who cares about that? ssh [email protected] -p2222 (pw:guest) 连上后,目录下有c源码和可执行文件, 首先查看下程序开了那些防护措施: gdb-peda$ checksec CANARY : ENABLED FORTIFY : disabled NX : ENABLED PIE : disabled RELRO : Partial 这里开启了canary,所以我们只能够利用一次任意内存写的功能,无法通过写入shellcode […]

gdb peda常用指令

info 查看各种信息: info file  查看当前文件的信息,例如程序入口点(Entry point) info break 查看当前断点信息 disassemble+func 对制定的函数进行反汇编 break +”地址” 设置断点 r  等同于“run” 运行程序 c 等同于”continue”,继续执行 x /<n/f/u> <addr> n、f、u是可选的参数。   n是一个正整数,表示需要显示的内存单元的个数,也就是说从当前地址向后显示几个内存单元的内容,一个内存单元的大小由后面的u定义。   f 表示显示的格式,参见下面。如果地址所指的是字符串,那么格式可以是s,如果地址是指令地址,那么格式可以是i。   u 表示从当前地址往后请求的字节数,如果不指定的话,GDB默认是4个bytes。u参数可以用下面的字符来代替,b表示单字节,h表示双字节,w表示四字 节,g表示八字节。当我们指定了字节长度后,GDB会从指内存定的内存地址开始,读写指定字节,并把其当作一个值取出来。   <addr>表示一个内存地址。   注意:严格区分n和u的关系,n表示单元个数,u表示每个单元的大小。 layout:用于分割窗口,可以一边查看代码,一边测试。主要有以下几种用法: layout src:显示源代码窗口 layout asm:显示汇编窗口 layout regs:显示源代码/汇编和寄存器窗口 layout split:显示源代码和汇编窗口 layout next:显示下一个layout layout prev:显示上一个layout Ctrl + L:刷新窗口 Ctrl + x,再按1:单窗口模式,显示一个窗口 Ctrl + x,再按2:双窗口模式,显示两个窗口 Ctrl + […]