- Today
- Total
목록Pwnable (104)
Phantom
이름과 시리얼을 입력하고 체크를 누르면 성공 또는 실패가 되는 문제이다. 은근히 간단하더라. 이제 익숙해져서그런가..하하 우선 아이다에 올려서 보려 했으나 그래픽뷰가 먹히질 않는다 그리고 오히려 이뮤니티가 더 편한기분이랄까 그래서 이뮤니티로 풀어보려 한다.. 먼저 VB머신 들어가기 전에 분기문을 찾으려 문자열을 검색했더니 있다. 아무거나 들어가서 그 위에 비교함수나 명령어가 있는지 알아봐야 겠다. 비교함수가 딱 한가지 있더라. 이 함수와 위의 인자 두 개에 BP를 걸고 F9를 누른다. 두 개의 인자를 받고 vbaVarTstEq함수를 실행한다. 그리고 JE명령어를 통해 성공 또는 실패 분기문으로 들어간다. JE를 수정해서 원하는 곳으로 가도 되고 ZF플래그를 조작해도 되지만 원하는 건 시리얼 값이다. 그래..
리버싱의 처음을 대표한다고 해도 모자라지 않을 abex crackme 1 이다 이것을 나도 처음 리버싱을 배울 때 풀어 본 적이 있다. 그리고 아주 잠깐 어떤 스터디를 들었는데 거의 리버싱 스터디였다. 난 견디지 못하고 나왔다. 그 때 당시 이제 레지스터를 익히는 중 이고 함수 프롤로그 에필로그 등등 메모리의 기초를 익힐 때라 정말 힘들었다. 그러다 어쩌다 줏어 들었던 EAX값이 5여야 원하는 방향으로 분기가 된다는 것을 들은 것이 전부이다. JMP 방식도 알긴 하는데 다 적어볼까 한다 우선 프로그램을 실행 해보자 음…하드를 CD-Rom으로 인식하게 하라고 하며 CD-Rom이 아니라며 시무룩해한다. 디버깅 툴로 자세히 살펴보려 한다 ida를 사용 했다. 여태 gdb만 사용하다가 이것을 사용하니 처음엔 조..
프로그램을 클릭하면 이렇게 뜨면서 종료한다. 보아하니 keyfile이 없어서 에러라 뜨는 것 같다. 디버거로 열어보자 보아 하니 CreateFileA함수의 리턴값으로 아래 JE문에서 분기가 일어나는 것 같다. CreateFileA함수에 대해 알아봐야 할 것 같다. CreateFile 함수에 대한 자세한 것은 여기로 함수의 인자 중에 Mode에서 OPEN_EXISTING으로 되어 있다. 존재하는 파일을 연다는 것이다. 그리고 호출 된 후 eax를 비교하는 것을 보아 리턴값만 알면 될 것 같다. 함수가 리턴에 성공하면, 리턴값은 특정 파일이나 디바이스, 이름있는 파이프, 또는 메일 슬롯의 열려있는 핸들값이 된다. 영어 맞나..? 나는 파일이 없으므로 -1을 리턴하고 같으므로 JE에서 에러로 향한다. 그럼 파..
네임과 시리얼을 넣고 Check를 누르면 맞는지 안맞는지를 나누는 프로그램 같다 디버거로 열어보자 비주얼 베이직으로 만들어진 프로그램들은 이 엔진을 사용한다 그래서 이 안으로 들어가야 한다. 우선 여기서 문자열들을 보니 이렇게 되어있다. 비교하는것이 어떻게 되어있는지 몰라 찾아보니 vbaVarTstEq함수가 문자열 비교 함수인 것 같다. 여기에 BP를 걸고 들어가봐야 겠다. 함수 콜되기 전에 인자 넣는곳에다 BP를 걸고 했는데 스택 근처에 문자열이 보인다, 그리고 아래에 다른 문자열도 보인다. 혹시 Phantom의 시리얼 값이 "B4CCC5D2"는 아닐까 해서 한번 값을 넣어봤다. 맞는 것 같다.
CrackMe 1번을 실행하면 다음과 같이 뜬다. CD-Rom처럼 인식하게 만들라고 한다. 우선 디버거로 열어봐야 할 것 같다. 이 문제에서 핵심은 GetDriveTypeA같다. 실행 해보니 리턴값으로 3을 준다. 이 값이 무엇을 의미하는지 알아보자. 지금 리턴값의 3은 HDD로 인식했다 우리가 인식하게 해야할 값은 5번이다. 애석하게도 내 PC에는 cdrom이 없다. 그래서 리턴하고 난 다음에 값을 5로 조정할 것이다. 에…..5로 바꿔도 되지가 않네 마지막에 왜 401003과 3을 비교하는건지 이해가..ㄷ 결국 401003으로 바꾸고 실행했다. Clear!!
프로그램을 실행하면 이런 모습이다. 여기서 아무런 값을 입력하면 패스워드가 틀렸다고 나온다. 패스워드 값을 찾는 것이 이 문제의 답인 것 같다. 디버거로 열어서 문자열을 찾는다. 문자열들에게 BP를 걸고 한번 Congratulation으로 이동해본다. 우선 보이는 점프문 근처에 모두 BP를 걸었다. 아스키 문자열이 보이는데 저게 비교 문자열인 것 같다. F9를 눌러 진행한다. 이 부분에서 걸렸는데 ESP+5와 61과 비교한다 61은 a이다. 여기서 +5는 "h"를 의미한다 값이 틀렸네. 아래 JNZ를 만나 바로 메시지박스 함수로 오게 된다. 두번째 값은 a이다. 다시 실행하여 값을 집어넣는다. 2를 push하고 pa다음인 antom과 5y를 push한다. 아마도 현재로서는 –a5y-----인 것 같다. ..
이번 문제는 RET Sleding 을 방해해버리고 SFP도 복원시킨다 그리고 힌트에는 GOT Overwrite와 pop_pop_ret 함수가 있다. 이번 문제는 GOT Overwrite를 이용한 ROP이다. 생각 보다 쉬울 듯 하다. Ret Sleding을 할 필요도 없고, SFP를 조작할 필요도 없다. 우리는 PPR가젯이 있기 때문에 strcpy함수로 어느 함수의 GOT에 system함수의 주소를 넣고 또 다른 어느 곳에 /bin/sh문자열 가젯을 넣을것이다 그리고 어느 함수를 실행하면 system("/bin/sh")가 되게끔 할 것이다. 소스를 보면 strcpy다음에 memcpy와 memset이 있는데 우리는 memcpy의 GOT에 system함수의 주소를 넣고 Bss 영역에 /bin/sh를 넣고 실..
이번 문제는 setuid가 걸려 있지 않고, xinetd가 hell_fire권한으로 문제를 실행 하고 있다. 라고 어느 블로그에 글이 있다. 뭔 소린지 이해가 가지 않아서 찾아 보기로 했다. Xinetd로 문제를 실행 하고 있다는 뜻은 이것이었다. Xinetd.d로 바이너리를 서비스하면 자동으로 입출력을 연결시켜주며 쉘코드없이 /bin/sh를 해주는 것만으로도 쉘을 딸 수 있다고 한다. 우리는 이 문제를 7777포트를 이용하여 풀면 되는 것이다. 이번 문제는 풀이가 3개나 있다고 한다. Do_system()을 이용한 풀이, another Fake EBP, GOT OverWrite 이렇게 있다고 한다. Do_system()을 이용한 풀이 Do_system()이란 원래 system()함수 내에 호출되는 함수..
이번 문제는 RET Sleding 문제이다. NOP Sleding 이랑 다를 것이 없다 단지 RET를 여러 번 넣어 RET명령으로 원하는 곳에서 할 뿐이다. 이번 문제에서는 Fake EBP 사용을 막았다 SFP를 저장하고 오버플로우 한 다음에 다시 복원한다 그러면 당연히..SFP는 안전해진다. RET를 계속 실행 시킬 경우 ESP는 계속 높은 주소로 올라가게 된다. Ret는 jmp eip 이기 때문에.. 우리는 그럼 우리에게 맞는 주소를 찾아야 한다. 우선 strcpy 바로 다음과 ret에 BP를 걸고 RET에 아무 값이나 넣고 실행해본다. 자… 0x41414141 다음에 여러 부분이 보이는데 이제…RET Sleding으로 필요한 곳을 찾아서 이 다음으로 필요한 함수를 쓸 것이다. 필요한 함수는 아마 e..
Colored By Color Scripter™123456789101112131415161718192021222324252627282930313233343536/* The Lord of the BOF : The Fellowship of the BOF - assassin - no stack, no RTL*/ #include #include main(int argc, char *argv[]){ char buffer[40]; if(argc