반응형

전체 글 32

[Pwnable.kr] mistake 문제풀이

먼저 mistake.c 내용을 확인한다. 이 코드를 보면 fd에 open함수의 결과가 들어가고 이것이 0보다 작은지 비교하는것처럼 보인다. if(fd=open("/home/mistake/password",O_RDONLY,0400) < 0) 하지만 연산자 우선순위가 =보다 0)) 또한 아래의 코드를 통해서 buf_buf2도 사용자로부터 입력을 받을 수 있다. scanf("%10s", pw_buf2); 그리고 pw_buf2를 1과 xor한다. #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i

[Pwnable.kr] leg 문제풀이

ssh에서 실행하니 전과는 다른 형태의 쉘이 나와서 칼리 리눅스에서 파일 2개를 다운받아서 진행했다. leg.c의 내용을 확인해보자. #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push{r6}\n" "addr6, pc, $1\n" "bxr6\n" ".code 16\n" "movr3, pc\n" "addr3, $0x4\n" "push{r3}\n" "pop{pc}\n" ".code32\n" "pop{r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key)..

[Pwnable.kr] Input 문제풀이

ssh로 접속해 input.c의 내용을 확인해본다. 엄청 길지만 대략적으로 보니 stage 5까지 클리어하면 플래그가 나오는 것 같다. 그러면 stage 1부터 차근차근 풀어보자. stage 1 코드 인자의 개수가 100개여야하고, argv['A']가 \x00, argv['B']가 \x20\x0a\x0d이면 클리어이다. stage 2 코드 std input으로 \x00\x0a\x00\xff를, std error로 /x00/x0a/x02/xff를 주면 된다. stage 3 코드 \xde\xad\xbe\xef라는 환경변수에 \xca\xfe\xba\xbe 값을 넣어주면 된다. stage 4 코드 \x0a라는 파일을 열어서 첫 4바이트가 \x00\x00\x00\x00이면 된다. stage 5 코드 argv['C..

[Pwnable.kr] Passcode 문제풀이

우선 ssh로 접속하여 passcode.c의 내용을 확인하면 다음과 같다. 코드를 보면 passcode1, passcode2를 입력받는 부분이 있는데, 자세히 보면 &passcode가 아니고 &가 빠져있는 것을 볼 수 있다. 이는 passcode1, passcode2 변수에다가 우리가 입력한 값을 저장하겠다는 의미가 아니라 passcode1, passcode2가 있는 주소에다가 우리가 입력한 값을 넣겠다는 의미이다. 그래서 쓰레기값이 있는 주소에 우리가 입력한 값을 넣어 오류가 뜨게 된다. 우선 gdb로 함수들을 자세히 보자. welcome 함수 name값을 ebp-0x70에 저장한다. login 함수 passcode1은 ebp-0x10에 위치하는것을 알 수 있다. 0x70 - 0x10 = 0x60이므로..

[리버싱] 함수의 프롤로그와 에필로그

함수의 프롤로그와 에필로그는 스택 프레임에 관여하는 개념이다. 스택 프레임 esp레지스터는 스택 포인터 역할을 하고, ebp는 베이스 포인터 역할을 한다. 스택 포인터는 현재 스택의 가장 위쪽을 가리키고 있는 포인터이고, 베이스 포인터는 현재 스택의 가장 바닥을 가리키고 있는 포인터이다. esp는 프로그램안에서 계속 변경되는 값이기 때문에 esp값을 ebp에 복사해주고 후에 어떤 값에 접근하고자 할때 ebp를 사용한다면 아무리 esp값이 바뀌어도 ebp를 이용하여 파라미터나 변수에 더욱 쉽게 접근할 수 있다. 프롤로그 : 스택 프레임을 생성하기 위한 작업 push ebp //ebp를 스택에 저장하고(ebp에 esp를 넣기 전에 원래의 값을 저장) mov ebp, esp //esp에 ebp를 저장한다. 에..

카테고리 없음 2019.09.22

[GDB] 명령어 정리

1. gdb [파일] 파일을 gdb로 불러온다. * 옵션 gdb -q [file] : gdb를 시작할때 여러정보들을 출력하지 않고 실행된다. gdb --args [file] [argv1] [argv2] ... : 파일과 함께 인자들을 줄 수 있다. 2. r / run gdb로 불러온 프로그램을 실행한다. *옵션 run argv1 argv2 ... : 위에서 gdb --args로 인자를 넘길수도 있지만 이 명령어에서 옵션을 주어 인자를 넘길 수도 있다. 3. disas [함수] / disassemble [함수] 특정 함수의 어셈블리 코드를 보고싶을때 사용한다. 4. b *[주소] / break *[주소] 입력한 주소 위치에 브레이크 포인트를 설정한다. 5. b [function] / break [funct..

Linux/명령어 2019.09.22
반응형