본문 바로가기

pwnable.kr :: cmd2_9pt by ORANG 보호되어 있는 글입니다. 더보기
pwnable.kr :: cmd1_1pt by ORANG 보호되어 있는 글입니다. 더보기
[Reversing.kr] Easy Unpack 100pt 그냥 하다보니 풀렸는데.. 왠지 0x401150 인것 같길래 써보니까 풀렸다. 더보기
[Reversing.kr] Easy ELF 100pt scanf를 통해 문자열을 입력받고, check_auth 함수의 반환값이 "corrcet" 문자열 출력 부분으로 이어진다. 그냥 바이트 단위 연산을 맞춰주면 아래와 같다. 0x804a020"x" ^ 0x34\x4c0x804a021"1"\x310x804a0220x7c ^ 0x32\x4e0x804a0230x88 ^ 0xdd\x550x804a024"X"\x58 0x804a0250x00\x00 "\x4c\x31\x4e\x55\x58" -> "L1NUX" 이므로 그대로 입력하면.. 더보기
[Reversing.kr] Easy Keygen 100pt 시리얼이 "5B134977135E7D13"인 Name을 찾으면 된다.IDA로 열어보면.. 위와 같습니다. 대충 흐름은 이름 입력받고 - 시리얼 키 만들고 - 시리얼 입력받아서 비교합니다. 시리얼 키 만드는 과정은 34 ~ 39 라인인데 1바이트 단위로 0x10, 0x20, 0x30 과 xor을 계속 반복합니다. 각각 다시 xor 연산을 해주면.. 더보기
[Reversing.kr] Easy Crack 100pt 실행시켜보니 위와 같았다.먼저 main함수가 시작되는 부분을 찾고, 위의 "Incorrect Password" 문자열을 찾은 후, 해당 문자열을 출력해주는 부분이 호출되는 부분들을 모두 찾았다. 4군데 정도 있길래 위에서 부터 차례대로 찾아봤다.문자열 자체에 특별한 연산없이 바이트 단위로 그대로 비교하는 것 같길래01234567890ABCDEFGH 이런식으로 넣어주고 그냥 비교 부분마다 체크했다. GetDlgItemTextA 를 통해서 입력받은 문자열을 차례대로 비교하는데,ESP+4 부터 입력받은 문자열이 위치한다. 첫번째 비교는 2번째 글자 vs 0x61("a") 이고 두번째 비교는 문자열의 3번째 문자 주소 vs "5y" 주소 를 0x401150 함수를 통해서 비교하는데 함수 내용은 아래와 같다.ca.. 더보기
CodeGate 2015 Quals - Mashed Potato CodeGate 2015 Quals - Pwnable 600pt, Mashed Potato 메모리 보호기법은 SSP와 NX, ASLR만 걸려있는 상황이고,비슷한 환경으로 구성하고 다시 풀어봤다. ( 로컬 환경 구성 : Ubuntu Linux 14.04 x86_64 ) 먼저 취약점으로 보이는 부분은 바로 보인다. leave_plain() 함수 내부에서 fgets 입력을 2번 받는데, 첫번째로 입력받은 값만큼 2번째 입력을 받는다. 이 부분에서 BOF가 발생하는데, SSP가 걸려있기 때문에 canary 값을 알아내야 했다. 사실 바이너리 자체는 로그를 남기는 기능만 했는데, 선택지가 2개밖에 없기 때문에 ( 1. 암호화 // 2. 평문 // 3. 종료 )그냥 바로 암호화 부분의 함수를 보면.. 입력받을 최대.. 더보기
2-Pass Assembler 구현 보호되어 있는 글입니다. 더보기
Code Engn - Basic 20 RCE 코드엔진 basic 마지막 문제. 위와같은 방식으로 출력되도록 하면 된다.먼저 PEiD로 확인해보니 어셈블리어로 코딩되어있는 듯하다. 실행해보면 그냥 아래와 같음 먼저 코드부터 확인해보니 CreateFileA()에서 반환값이 -1이다.Mode = OPEN_EXISTING 인데 "CRACKME3.KEY" 파일이 존재하지 않기 때문이다. 파일을 만들고 진행해보면.. 아래와 같은 코드들이 나오는데 이부분이 핵심이다. 먼저 file로부터 0x12(18)바이트 를 읽어오는데, 읽어온 데이터는 0x402008 에, 읽어온 데이터의 길이값은 0x4021A0에 저장한다.그리고 조건 분기문을 두번 통과하면 Cracked가 출력되는 함수로 이어지게 된다. 먼저 첫번째 조건문은 0x401066 을 보면 읽어온 길이값이 0x.. 더보기
Code Engn - Basic 19 RCE 실행시켜보면 위와같은 메세지창 하나만 뜨고 누르면 종료된다. UPX로 패킹되어있어서 일단 언패킹 후 디버깅을 시작해보면.. 제대로 동작하지 않고 경고창이 뜬다. API 목록을 보니 IsDebuggerPresent()를 이용하여 안티디버깅이 되어있었다. 일단 이부분을 패치하고 진행해보면.. 일단 문제에서는 밀리세컨드 단위로 종료되는 시간을 구하라고 하길래, sleep함수가 사용된 부분을 먼저 찾았다.찾다보니 아래와 같이 timeGetTime()함수가 호출되는 부분이 있었고 해당 함수를 찾아보니.. 윈도우 시작 시점으로부터 시간을 재는 용도의 함수였다. 일단 해당 함수가 호출되는 부분들을 모두 찾아봤는데, 문제에서 시간의 차이를 잰다는 점을 이용하여timeGetTime() - timeGetTime() 이런 .. 더보기