반응형

War Game 13

[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이므로..

[FTZ level2] 개념 및 문제풀이

문제풀이 level2의 계정으로 접속하여 무슨 파일들이 있는지 확인해본다. 힌트를 보면 "텍스트 파일 편집 중 쉘의 명령을 실행시킬 수 있다는데 ..."라고 뜬다. level1에서 했던것과 동일하게 find명령어를 이용하여 찾아본다. 나온 파일의 종류를 확인해보면 실행파일임을 알 수 있다. 실행해보면 아래처럼 vi편집기가 나온다. vi편집기에서 !를 사용한면 vi편집기를 종료하지 않고 쉘 명령어를 실행시킬 수 있다는 점을 생각해보면 아까 힌트가 왜 주어졌는지를 알 수 있다. 그래서 쉘을 실행하면 비밀번호를 알아낼 수 있다. 개념 vi 편집기에서 편집기를 종료하지 않고 명령어를 실행하기 :! 특히 쉘을 실행하게 하고싶다면 :[쉘이름] -> 여기서 [쉘 이름]은 /bin/bash나 shell, sh 모두 가..

[LOS] Orge 문제 풀이

문제 풀이 처음에 문제를 보고 org문제와 비슷하다는 생각을 했다. org문제처럼 비밀번호를 직접 알아내야 문제가 풀리는 구조였기 때문이다. org에서는 직접 값들을 일일이 입력해보는 방식으로 문제를 풀었는데 이번에는 파이썬으로 비밀번호를 알아낼 수 있게 코드를 작성해보기로 했다. * 알고리즘 및 코드 설명 org문제와 마찬가지로 코드를 보면 어떤 값이 참이 될 때 Hello admin이 나오는 것을 확인할 수 있다. 그래서 그때와 마찬가지로 우리가 특정 값을 url로 넣었을 때 Hello admin이라는 글자가 페이지에 나온다면 그 조건을 만족하는 것이므로 비밀번호를 유추할 수 있다. 이 성질을 이용해 우리가 넣은 조건이 참인지 거짓인지 판단한다. 우선 length함수를 통해 비밀번호의 길이를 알아내고..

[LOS] Wolfman 문제 풀이

문제 풀이 이 문제같은 경우에는 공백을 예외처리를 해놓아서 우리가 하던대로 공백을 이용해 쿼리를 더해주는 방법은 통하지 않는다. 근데 우리에겐 공백과 비슷한 기능을 하는 tab이 있다ㅎㅎ 공백 대신 tab (url encoding : %09) 을 입력하여 원래 하던대로 쿼리를 작성해주면 문제가 정말 간단하게 풀리는것을 확인할 수 있다.

[LOS] Orc 문제 풀이

문제 풀이 우선 밑에서 3번째 줄 if문을 보면 결국 패스워드가 모두 일치해야 이 문제가 풀림을 알 수 있다. 이런 문제 유형을 blind sql injection이라고 한다. 여기서 blind sql injection이란, 직접적으로 우리가 원하는 값을 출력할 수 없는 형태에서 여러가지 함수를 이용하여 특정 값을 추적해나가는 방식을 말한다. 이 문제를 풀기 위해서는 패스워드를 정확하게 입력해야만 한다. 그래서 우선 패스워드의 길이를 알아내가 위해 문자열의 길이를 나타내는 length함수를 이용하여 패스워드의 길이를 알아낸다. 쿼리문이 참이 아닐때는 아무것도 나타나지 않다가 참일 때 Hello admin 글자가 나타나는 성질을 이용해 length에 0부터 대입하여 pw의 길이를 알아낼 수 있다. 알아낸 ..

반응형