목록Wargame/pwnable.kr (21)
cgy12306
[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이다. 첫번..