security/포너블 - pwnable.kr

pwnable.kr - [Toddler's Bottle] random

민사민서 2023. 2. 6. 21:21
from pwn import *
s = ssh(user="random", host="pwnable.kr", port=2222, password="guest")
p = s.process(executable="/home/random/random")

key = 0xdeadbeef ^ 0x6b8b4567 # rand() 하면 첫 숫자로 항상 0x6b8b4567나옴
p.sendline(str(int(key)))

p.interactive()

 

<코드>
#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() 함수는 seed 정해져있으므로 프로그램 생성될 때 내부적으로 난수 생성 패턴(나오는 순서) 정해짐 - 매번 실행할때마다 동일한 값 나옴

// online c compiler에 rand() 돌려보면 됨
// 정석적인 방법은 gdb 분석 후 rand 함수 다음에 bp 걸고 r 한다음 x/gx $eax 해서 들어가있는 값 파악하면 됩니다 = 0x6b8b4567
// key = 0xdeadbeef ^ (rand()시 처음 나오는 숫자) 를 주면 된다

// 주의할 점은 파이썬 파일 제목이 random이면 안된다(이미 예약된 단어)
// from pwn import * 여기서 걸림