Pwnable.kr [dragon] 또 실행파일을 준당. http://pwnable.kr/bin/dragon ELF 32bit 파일이다 뭐에 홀렸는지 다 풀어놓고 마지막에 주소 '오타'를 내서 한참동안 복기를 엄청 다시 했다... 해당 파일은 간단한 게임이고, 프리스트, 기사 중에 선택해서 나오는 드래곤과 싸우는데, 드래곤은 아기, 엄마 번갈아가면서 나온다. 스킬 구성과 스탯 구성상 절대 이길 수 없는 싸움이고, 아이템이나 추가적인 기능은 없다. 코드를 살펴보면 고르라는 1, 2번이 아닌 3을 고르면 SecretLevel 함수로 들어간다. 해당 함수에서 strcmp를 넘어간다면 쉘을 실행시켜주지만 %10s로 글자수 제한도 있고, 힘들어보인다. 하지만 쉘 실행 코드가 안에 있으므로 나중에 점프뛸 곳을 찾으면 여기로 점프하면 되겠다. 이후에 .. Pwnable.kr [simple login] http://pwnable.kr/bin/login에서 파일 다운로드 가능 ELF 32bit 파일이고, canary랑 NX가 있는 것으로 나옴 근데 문제 풀다보면 canary 못 찾겠음 애초에 풀이방식도 auth 함수에서 memcpy를 이용해 ebp of main을 감염시키고 fake ebp로 correct 함수로 점프 뛰면서 기존 루틴 다 무시하고 그냥 쉘 따버리는 건데 checksec으로 확인한 건데 왜 있다고 나오는지 잘 모르겠음 어쨌든 실행해보면 입력값을 똑같이 해도 계속 hash값이 다르게 출력됨 뭔가 해쉬값 계산하는 루틴을 보면 초기화되지 않은 값들을 사용하는 부분들이 있고, gdb에서 재실행을 하는 경우에는 해쉬값이 똑같이 되는 것을 보았을 때 메모리 쓰레기 값을 통해서 계산이 이루어지는 것으.. Pwnable.kr [echo2] http://pwnable.kr/bin/echo2 위 주소에서 실행파일을 다운 받아서 분석해야 한당 ELF-64bit 파일이라 kali로 옮기고 우선 ida로 대략적인 코드를 분석했다 이전에 있었던 echo1과 똑같은 코드로 보이고, 1, 2, 3번 중에 이번에는 2, 3번이 구현되어 있는 상황 ㅇㅇ 이름은 24byte까지 받을 수 있고 2번 메뉴의 경우 &format으로 대놓고 FSB가 일어난다 이전에 4번 메뉴를 통해서 입력한 이름을 free 하고도 재차 물음에서 'y'를 하지 않으면 종료가 되지 않아 UAF에 대해서 언급했었는데, 이번 문제에 해당 사항이 똑같이 구현되어 있고, 3번 메뉴도 있으므로 FSB와 UAF를 같이 건드려야 하는 문제로 보인다. 메모리 leak을 해보면 6번째 부터 내가 입력.. Pwnable.kr[loveletter] 실행파일만 있는 상태에서 해당 파일을 분석해보면 이름을 입력 받고 해당 이름이 포함된 문자열 "echo I love 'input value' very much!"가 system 함수의 인자로 넘어간다. (asm : main + 465) 이 때 system 함수를 통해서 echo를 실행하므로, ; | & 등과 함께 다른 명령어를 삽입하는 방식을 생각했으나 구현되어있는 protect라는 함수에서 #&;`'"|*?~^()[]{}$\, 위의 문자열들을 다른 값으로 치환하는 과정을 거친다. 치환되는 값은 mov DWORD PTR [eax], 0xa599e2로 치환을 하는데, (asm : protect + 213) 3바이트 값인데 DWORD PTR을 사용하므로 가장 마지막 바이트는 0x00이 된다. 중간중간 계속 .. Pwnable.kr[fix] #include // 23byte shellcode from http://shell-storm.org/shellcode/files/shellcode-827.php char sc[] = "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69" "\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"; void shellcode(){ // a buffer we are about to exploit! char buf[20]; // prepare shellcode on executable stack! strcpy(buf, sc); // overwrite return address! *(int*)(buf+32) = buf; printf("get shel.. Pwnable.kr[tiny_easy] file tiny_easy의 결과값이 간단히 나오고 용량도 상당히 작다. readelf를 이용해서 entrypoint를 확인하고 gdb로 코드를 확인하면 pop eax pop edx mov edx, DWORT PTR[edx] call edx 가 전부이고 call edx에서 crash가 나면서 프로그램이 뻗는다. 몇 번 확인해본 결과 edx의 값이 argv[0]으로 들어가는 프로그램 절대 경로이다. 절대 경로에다가 스택 값을 주고 ASLR을 뚫고 스택에 올린 쉘 코드로 점프시키면 쉘을 얻을 수 있다. 조금이라도 쉽게 올라가기 위해 nop sled를 이용한다. from pwn import * payload = '\x90'*0x1000 + '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x.. Pwnable.kr[echo1] http://pwnable.kr/bin/echo1 에서 다운로드 받아서 해당 실행파일을 분석해야 한당. ELF 64bit 파일이고, ASLR을 제외한 보호기법은 적용되어 있지 않다. IDA pro를 이용해서 확인해보면 메뉴가 4가지이고 2, 3번 메뉴는 구현되어 있지 않고 4번 메뉴의 경우 종료 메뉴인데, 종료를 완료하지 않아도 항상 free를 하므로 double free가 되면서 crash는 일어나지만 해당 내용을 활용하는 방법은 모르겠다. 단순히 1번 메뉴에서 fgets함수를 이용해서 0x20만큼 할당된 buffer에 0x80까지 입력을 받으므로 여기 overflow를 이용한다. return 주소를 바꿀 수는 있지만, 쉘코드를 입력하고 해당 쉘코드로 어떻게 뛸지는 별개의 문제.. 0x20만큼의 더미 .. Pwnable.kr[ascii_easy] #include #include #include #include #include #include #define BASE ((void*)0x5555e000) int is_ascii(int c){ if(c>=0x20 && c 이전 1 2 3 4 5 다음