#include <stdio.h>

#include <string.h>

unsigned long hashcode = 0x21DD09EC;

unsigned long check_password(const char* p){

        int* ip = (int*)p;

        int i;

        int res=0;

        for(i=0; i<5; i++){

                res += ip[i];

        }

        return res;

}


int main(int argc, char* argv[]){

        if(argc<2){

                printf("usage : %s [passcode]\n", argv[0]);

                return 0;

        }

        if(strlen(argv[1]) != 20){

                printf("passcode length should be 20 bytes\n");

                return 0;

        }


        if(hashcode == check_password( argv[1] )){

                system("/bin/cat flag");

                return 0;

        }

        else

                printf("wrong passcode.\n");

        return 0;

}


Hint
hashcode를 5번씩 쪼개 저장 하므로 맞는 식을 세워 입력 해주면 된다.
./col `python -c 'print "\xC8\xCE\xC5\x06"*4 +"\xCC\xCE\xC5\x06"'`


'IT > Pwnable.kr' 카테고리의 다른 글

pwnable.kr / bof  (0) 2016.07.17
pwnable.kr / fd  (0) 2016.04.07




#include <stdio.h>

#include <stdlib.h>

#include <string.h>

char buf[32];

int main(int argc, char* argv[], char* envp[]){

        if(argc<2){

                printf("pass argv[1] a number\n");

                return 0;

        }

        int fd = atoi( argv[1] ) - 0x1234;

        int len = 0;

        len = read(fd, buf, 32);

        if(!strcmp("LETMEWIN\n", buf)){

                printf("good job :)\n");

                system("/bin/cat flag");

                exit(0);

        }

        printf("learn about Linux file IO\n");

        return 0;


Hint 

0x1234 16진수 ==>> 4660 10진수

이고,buf가 LETMEWIN 와같을때,

'IT > Pwnable.kr' 카테고리의 다른 글

pwnable.kr / bof  (0) 2016.07.17
pwnable.kr / col  (0) 2016.04.09

세그먼트 레지스터: 


CS(Code Segment) – 코드를 저장하는 메모리 블록 


DS(Data Segment) – 데이터를 저장하는 메모리 블록 


EX(Extra Segment) – 비디오와 관련된 것을 위해 사용됨 


SS(Stack Segment) – 루틴으로부터 리턴 어드레스를 저장하기 위해 프로세서에 의해 사용되는 레지스터  


인덱스 레지스터: 


SI(Source Index) – 문자열/배열의 소스를 지정하기 위해 사용됨. 


DI(Destination Index) – 문자열/배열의 목적지를 지정하기 위해 사용됨. 


IP(Instruction Pointer) – 다음 명령의 주소를 저장하고, 그래서 직접적으로 변경될 수 없음.   

 

스택 레지스터: 

BP(Base Pointer) – 스택 오퍼레이션을 위해 SP 와 연결되어 사용됨. 


SP(Stack Pointer)   


특별한 목적을 위한 레지스터: 

IP(Instruction Pointer) – 실행된 명령의 offset 를 가지고 있음. 


Flag – 분기(branching)를 위해 사용됨. 플래그 레지스터는 크기가 1 비트이다.

=============

EAX : 곱셈이나 나눗셈 연산 할 때 사용되는 레지스터

 

EBX : 주소 같은거 간접적으로 접근할 때 사용되는 레지스터 


ECX : 반복문 돌릴 때 루프 카운트 되는 레지스터 


EDX : EAX레지스터를 보조해주는 레지스터


EDI , ESI : 조작 , 복사시 소스데이터 주소가 저장


ESP , EBP : 스택프레임의 끝지점 주소가 저장

=========================================================================


' 해당 주소 피연산자를(로) 명령어 하라. '


피연산자란?

- 명령어의 대상과 목적

EX) 레지스터, 메모리, 레이블, 상수

Practice


※ 명령어 


 IA-32 어셈블리 명령어 모음.pdf


MOV : 원하는 곳으로 데이터를 이동 (메모리에서 메모리로는 이동 불가)

MOV 피연산자,값


XCHG : 두 레지스터의 값을 바꿈  

XCHG 레지스터1,레지스터2 


JMP : 원하는 주소나 라벨로 점프

JMP AX

JNE : 같지 않은 경우 점프

JE : 같은 경우 점프

JNZ : 0이 아닌경우의 점프

JZ : 0인 경우의 점프


CMP : 비교 명령

CMP AX ,0x8

점프 명령이 이뤄지기전에 100%일어남


ADD : 덧셈을 수행하는 사칙연산 명령

ADD 레지스터 1, 레지스터 2 

ADD 레지스터, 값  

MOV AX,5h  ;AX 의 값은 5h 

MOV BX,4h  ;BX 의 값은 4h  

ADD AX,BX  ;AX 에 BX 를 더하고, 그 값을 AX 에 저장(5h + 4h = 9h = AX)


XOR : 초기화

XOR AX,AX


LEA : 주소값 가져오기

LEA AX,주소


SUB : 뺄셈을 수행하는 사칙연산 명령

SUB 레지스터 1, 레지스터 2 

SUB 레지스터, 값  

MOV AX,5h  ;AX 의 값은 5h 

MOV BX,4h  ;BX 의 값은 4h  

SUB AX,BX  ;AX 에 BX 를 빼고, 그 값을 AX 에 저장(5h - 4h = 1h = AX)


INC : 피연산자 값을 1 증가

INC AX


DEC : 피연산자 값을 1 감소

DEC AX


POP : 원래 값을 회복

POP AX


PUSH : 레지스터의 값을 잠시 저장

PUSH BX


Practice


MOV AX,51h 


MOV BX,4Fh  


XCHG AX,BX  


PUSH AX 


MOV AX,34h 


POP BX  


PUSH BX  


POP AX  

'IT > Assembly' 카테고리의 다른 글

Reversing / 2일차  (0) 2016.04.17
Reversing / 1일차  (0) 2016.04.13
1. 어셈블리어의 장단점  (0) 2016.04.03

+ Recent posts