목록Wargame (116)
cgy12306
[passcode]welcome() 함수를 호출하고, login() 함수를 호출한다.welcome() 함수에서는 name 변수를 100byte만큼 할당해주고, 입력을 받는다.login() 함수에서는 passcode1 변수에 값을 입력하고, fflush() 함수로 스트림의 버퍼를 비워준다.이후 다시 passcode2 변수에 값을 입력하고, passcode1은 338150을 passcode2는 13371337과 비교해서 같으면 /bin/cat flag 명령어를 실행한다.하지만 저 위에서 scanf의 사용법이 잘못 되었다.원래라면 scanf("%d", &passcode1); 로 작성 되어야 하지만 &가 빠져있다.이 말은 passcode1의 주소에 값을 넣는게 아닌 passcode1이 가지고 있는 값을 주소로 ..
[shellshock]소스코드를 보자.bash로 echo shock_me 명령어를 실행한다.shellshock는 bash shell에 존재하는 보안 취약점이다. 함수 끝에 임의의 명령어를 추가로 삽입할 경우, Bash가 함수에서 처리를 멈추지 않고 추가로 삽입한 명령어를 계속 실행 시키기 때문에 이런 취약점이 발생한다.환경변수에서 값을 넣을 뿐만 아니라 함수도 넣을 수 있다.() {로 시작하는 문자열을 시스템 환경변수에 저장하면 동일한 이름을 가진 함수로 선언이 된다. bash를 실행하면 등록된 환경변수를 읽어오는데 여기서 함수가 등록되어 있으면 함수를 실행한다.: 는 true라는 값을 가진다. 함수 내부를 참으로 만들고 뒤에 /bin/cat flag 명령어를 삽입해서 shellshock 바이너리를 실행..
[mistake]힌트를 보면 hint : operator priority 라고 적혀있다.연산자 우선순위에 대한 문제인것 같다.코드를 살펴보자.#include #include #define PW_LEN 10 #define XORKEY 1 void xor(char* s, int len){ int i; for(i=0; i
[leg]#include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\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); if( (key1()+key2()+key3()) == key ){ printf("Congratz!\n");..
[flag] flag 바이너리를 다운받고 실행해 봤다. 동적할당 후 strcpy로 복사하겠다는 말 같다. 디버깅 해보려 했는데 심볼 테이블이 로드 되지 않는다고 한다. checksec 명령어로 보호기법을 확인해봤더니 패킹이 걸려있다. 패킹은 원본 프로그램을 보호하기 위해 암호화나 압축, 특정 연산으로 코드를 변조시키는 것이다. UPX 툴을 이용해서 언팩해보자. main 부분을 보니 flag를 cs 영역에서 가져오는 것을 볼 수 있다. 따라가보면 플래그 값을 확인할 수 있었다.
[bof] bof 바이너리를 다운받고, c 파일을 보자. func 함수에 0xdeadbeef 값을 넘겨준다. func 함수에서는 넘겨받은 값을 key 변수에 저장하고 overflowme 변수를 32byte만큼 할당한다. gets로 overflowme 변수에 값을 입력하게 되는데 여기서 오버플로우가 발생하게 된다. 이후 if문에서 0xcafebabe 값과 비교해서 같으면 /bin/sh 명령어를 실행하게 된다. 그럼 우리는 오버플로우가 발생할 때 deadbeef로 저장되어 있는 부분을 cafebabe로 변경하면 된다. func 함수에 들어왔을 때 프롤로그 과정을 거치기 전에 deadbeef가 있었던 것을 확인할 수 있다. gets 함수에서 A를 8개 넣어준 후의 스택 모습이다. overflowme 변수가 시..
[collision]col.c 파일을 보자. 첫번째로 받은 인자 값이 20byte 이어야 하고, 그 값을 가지고 있는 주소를 check_password 함수로 넘긴다.check_password 함수에서는 해당 주소를 다시 정수형 포인터에 담는다. 정수형 포인터는 배열로도 인식이 되는데 한 칸당 4byte로 인식한다. 즉, 4byte로 끊어서 모든 값을 더해 res 변수에 저장한 후 반환을 한다.이 반환된 값을 hashcode와 비교해서 같으면 /bin/cat flag 명령어를 실행한다.hashcode값은 0x21DD09EC이다. 10진수로 변환을 하게 되면 568134124라는 값이 나오는데 5로 나누어 떨어지지 않는다. 그래서 4를 빼준 후 5로 나누어주고 마지막 4byte에다가 4를 더해주면 된다.
[fd]ssh fd@pwnable.kr -p2222로 접속해보면 fd라는 바이너리가 보인다. 코드를 보면 아래와 같다. 첫번째 인자에서 0x1234를 빼서 fd라는 정수형 변수에 담고, read 함수를 fd와 buf를 이용해 호출한다.fd 변수를 파일 디스크립터로 사용하게 되는데, 파일 디스크립터는 프로세스에서 특정 파일을 참조할 때 사용되는 값이다.0 : 표준 입력, stdin1 : 표준 출력, stdout2 : 표준 에러, stderr.if문에서 buf와 LETMEWIN이라는 값을 비교해서 같으면 good job을 출력하고 /bin/cat flag를 수행하고 종료한다.우리는 fd라는 변수값을 0으로 만들어서 buf라는 변수에 LETMEWIN을 입력하면 된다.0x1234는 10진수로 4660이다. 첫번..