cgy12306

[pwnable.kr] blukat 본문

Wargame/pwnable.kr

[pwnable.kr] blukat

cgy12306 2020. 1. 27. 18:07

[blukat]


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
char flag[100];
char password[100];
char* key = "3\rG[S/%\x1c\x1d#0?\rIS\x0f\x1c\x1d\x18;,4\x1b\x00\x1bp;5\x0b\x1b\x08\x45+";
void calc_flag(char* s){
    int i;
    for(i=0; i<strlen(s); i++){
        flag[i] = s[i] ^ key[i];
    }
    printf("%s\n", flag);
}
int main(){
    FILE* fp = fopen("/home/blukat/password", "r");
    fgets(password, 100, fp);
    char buf[100];
    printf("guess the password!\n");
    fgets(buf, 128, stdin);
    if(!strcmp(password, buf)){
        printf("congrats! here is your flag: ");
        calc_flag(password);
    }
    else{
        printf("wrong guess!\n");
        exit(0);
    }
    return 0;
}

해당 코드를 보면 password 파일을 100byte 읽어와서 password 변수에 넣고, buf에 128byte만큼 읽어들인다.

그리고 password와 buf값을 비교해서 같으면 calc_flag에 password를 인자로 넘기고 호출한다.

calc_flag는 password를 key와 xor 연산해서 flag에 값을 넣고 출력을 하게 된다.

여기서 key 값은 미리 알려주고, 알아서 연산을 해서 출력을 하기 때문에 password 값만 알아내면 된다.

main에서 fgets로 password 값을 입력 받을 때 0x6010a0에서 가져오게 된다.

해당 메모리를 보면 값들이 들어있다.

이 값을 그대로 입력해주면 된다.

from pwn import *

p = process('/home/blukat/blukat')

payload  = '\x63\x61\x74\x3a\x20\x70\x61\x73'
payload += '\x73\x77\x6f\x72\x64\x3a\x20\x50'
payload += '\x65\x72\x6d\x69\x73\x73\x69\x6f'
payload += '\x6e\x20\x64\x65\x6e\x69\x65\x64'
payload += '\x0a\x00\x00\x00\x00\x00\x00\x00'
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += p64(0)
payload += '\x00\x00\x00\x00'

p.recv()
p.sendline(payload)

p.interactive()

'Wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] uaf  (0) 2020.02.02
[pwnable.kr] memcpy  (0) 2020.01.27
[pwnable.kr] unlink  (0) 2020.01.27
[pwnable.kr] asm  (0) 2020.01.27
[pwnable.kr] cmd2  (0) 2020.01.27
Comments