목록Write Up (43)
0x0102

ls -ll로 어떤 파일이 있는지와 그 권한을 살펴본다. flag에 바로 접근할 수 없으므로 앞서 풀었던 문제와 마찬가지로 col.c에 먼저 접근해본다. 코드를 해석해보니 먼저 20byte의 인자가 필요하며 인자가 check_password()에 넘겨나온 반환값이 hashcode와 같아야한다는 것을 알 수 있다. 이 때, check_password() 가 인자를 int형으로 변환하여 for문을 돌리고 4byte씩 읽어들인 후 res에 값을 적고, 마지막에 반환한다. 이렇게 반환된 res가 hashcode (0x21DD09EC) 와 같으면 해결된다. 20byte인 인자를 4byte씩 읽어들이므로 hashcode의 값을 5로 나누고 값을 붙이면 될 것 같은데, hashcode의 값이 5로 나누어지지 않으므로..

우분투로 문제 포트 접속. passwd는 guest 권한을 확인해보면 현재 우리는 fd 그룹에 속해져있기 때문에 fd 파일은 읽기와 실행, fd.c 파일은 읽기, flag 파일에는 아무권한이 없는 것을 확인할 수 있다. 단서를 찾기 위해 cat 명령어로 fd.c 파일을 먼저 읽어보자. 이 때 atoi 함수가 눈에 띈다. atio 함수는 문자열을 정수로 변환하는 함수이다. 함수를 읽어보면 인자값이 0x1234와 뺄셈 계산이 이루어진 후 fd에 할당되고 fd에 0이 들어가면 사용자가 입력하는 값을 buf 안에 저장하게 됨을 알 수 있다. 이후 strcmp로 문자열을 비교하는데 같다면 0 다르면 1을 반환한다. 결론적으로 0x1234(십진수로 변환 필요)를 인자값으로 설정하여 fd에 0을 넣어주고 LETMEW..

이 프로그램은 몇 밀리세컨드 후에 종료 되는가 PEiD에서 확인해본 결과 문제 파일이 패킹 되어 있으므로 upx 언패킹을 해준다. 디버거에서 열어보면 다음과 같은 오류가 뜨는데, 이는 디버거 탐지를 막음으로 해결할 수 있다. isdebuggerpresent를 찾아서 TEST를 CMP로 변경함으로 디버거 탐지를 막아준다. 이후 Timegettime에 bp를 찍고 실행해본다. 이 때 ebx값을 확인해보면 008AF878이다. 그러나 프로그램을 실행하다보면 최종적으로 ebx + 4 값과 비교하는 것을 알 수 있다. 우리가 필요한 값은 ebx + 4 주소에 있는 값이다. 하단 hex dump에서 84f878 + 4에 있는 값을 찾아준다. 해당 주소에 있는 수는 리틀엔디안 방식으로 2B70이다. 이를 10진수로 ..

upx 패킹과 언패킹에 대해 말씀드리겠습니다. 먼저 패킹이란, "실행 압축"과 같은 표현으로 실행 파일 내부에 있는 코드를 압축한 상태로 저장하고 있다가 파일을 실행하면 메모리에서 압축을 해제한 후 파일을 실행 시키는 기술입니다. 패킹을 하면 파일의 크기를 3~4배 가량 줄일 수 있으며 크래커의 리버싱으로부터 보호할 수 있다는 장점이 있어 리버싱 문제에서 자주 사용됩니다. UPX 언패킹을 하기 위해서는 먼저 PEiD와 같은 패커 탐지 툴을 사용하여 파일의 패킹 여부를 확인해야합니다. PEiD와 확인해볼 샘플 파일을 동일한 폴더에 넣고 PEiD에 샘플 파일을 불러옵니다. EP section을 통해 샘플파일이 UPX로 패킹 되어 있는 것을 확인할 수 있습니다. 언패킹을 위해서는 먼저 해당 경로에서 운영체제에..
보호되어 있는 글입니다.
보호되어 있는 글입니다.

ame이 CodeEngn일때 Serial은 무엇인가 문제 파일을 다운로드 받고 PEiD에서 패킹 여부를 확인해보니, 별다른 언패킹 과정은 필요없어 보였다. 문제 파일을 디버거에서 실행시킨 후 실행해보았다. 다음과 같이 name과 serial 을 입력받는 메시지 박스가 나타나는 것을 볼 수 있다. 디버거에서 search for -> all referenced text strings 로 텍스트 입력시 나타나는 문구를 찾아보았다. 확인해보면, you serial is wrong, try again 이라는 문구를 볼 수 있고 더블클릭하여 해당 주소로 이동한다. 상단의 je문으로 성공/ 실패 시 문구가 각각 갈리는 것을 확인할 수 있고 바로 위에 eax 값들이 or연산 되는 것을 알 수 있다. eax가 함수의 반..

Name이 CodeEngn일때 Serial을 구하시오 먼저 해당 문제 파일의 패킹 여부를 알아보기 위해 PEiD에 넣어보았다. .text 형식으로 별다른 언패킹은 필요 없어 보인다. 파일을 디버거에서 실행해보면 다음과 같이 name과 password를 입력받는 입력창이 뜬다. name에는 문제에서 주어진 CodeEngn을 , 패스워드에는 임의의 값을 넣어보았는데, wrong password!라는 문구가 뜨며 프로그램이 종료된다. 먼저 문자열을 입력 받는 곳을 찾아 살펴보았다. 역시 CMP문이 있었고 EAX의 주소와 EBP - 3C의 주소 값을 비교하는 것을 확인할 수 있었다. 해당 CMP문에 BP를 걸고 F9로 바로 실행시켜보았다. 이후 메시지창에 아까와 마찬가지로 주어진 name과 랜덤값 passwor..

Name이 CodeEngn일때 Serial을 구하시오 먼저 문제 파일을 다운로드 받고 패킹 여부등을 알아보기 위해 PEiD에 넣어보았다. CODE형식이라 별다른 언패킹 과정 없이 바로 디버거에서 실행시켰다. F8키로 실행해보면 NAME과 SERIAL을 입력하는 창이 뜬다. 문제에서 Name이 CodeEngn일 때 시리얼 넘버를 구하라고 했으므로 일단 name은 알맞게 작성한 후 시리얼 값에는 아무 값이나 대입했다. 그러니 try again이라는 메시지 창과 함께 프로그램이 종료되었다. 해당 부분 코드를 찾기 위해 프로그램을 다시 실행한 후 우클릭 -> search for -> all referenced text strings를 살펴보았다. 찾은 아스키 값 위쪽에 분기문과 cmp가 보여 여기서 값을 비교한..

Name이 CodeEngn 일때 Serial을 구하시오 (이 문제는 정답이 여러개 나올 수 있는 문제이며 5개의 숫자로 되어있는 정답을 찾아야함, bruteforce 필요) Ex) 11111 먼저 문제에서 bruteforce가 필요하다 했으므로 bruteforce가 무엇인지 알아보자. 브루트 포스(brute force), 즉 무차별 대입은 조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법이다. 다음과 같은 방법이 필요하다는 것을 인지하고 문제를 풀어야겠다. 문제 파일을 다운로드 받고 PEiD에 넣은 결과 upx 언패킹이 필요해보였다. 명령어를 사용하여 해당 파일을 언패킹 하였다. 이후 이뮤니티 디버거에서 열어보았다. f8키로 진행시키면 다음과 같은 입력창이 나온다. 두 줄에 거..