'Wargame > CodeEngn' 카테고리의 다른 글
CodeEngn advance 7번 (0) | 2018.02.28 |
---|---|
CodeEngn advance 6번 (0) | 2018.02.08 |
code engn advance 4번 (0) | 2018.02.08 |
code engn advance 3번 (0) | 2018.02.08 |
code engn advance 2번 (0) | 2018.02.05 |
CodeEngn advance 7번 (0) | 2018.02.28 |
---|---|
CodeEngn advance 6번 (0) | 2018.02.08 |
code engn advance 4번 (0) | 2018.02.08 |
code engn advance 3번 (0) | 2018.02.08 |
code engn advance 2번 (0) | 2018.02.05 |
CodeEngn advance 6번 (0) | 2018.02.08 |
---|---|
code engn advance 5번 (0) | 2018.02.08 |
code engn advance 3번 (0) | 2018.02.08 |
code engn advance 2번 (0) | 2018.02.05 |
code engn advance 1번 (0) | 2018.02.04 |
code engn advance 5번 (0) | 2018.02.08 |
---|---|
code engn advance 4번 (0) | 2018.02.08 |
code engn advance 2번 (0) | 2018.02.05 |
code engn advance 1번 (0) | 2018.02.04 |
code engn basic 20번 (0) | 2018.02.04 |
codeengn advance 2번 문제다. 실행시켜 보니 비밀번호를 맞추면 되는 것 같다. 패킹은 따로 안되있어 그냥 열어봤다. 먼저 키입력하는 문자열을 찾아 주변 함수에 BP 걸고 F8로 하나씩 실행하면서 흐름을 파악해봤다. 그랬더니 별다른 분기점은 없고 CALL EDX라는 함수에서 프로그램이 종료된다. 들어가보니 저 많은 JNZ 구문을 통해 프로그램이 종료되는 함수가 호출된다. 마지막 0 값은 문자열을 입력했을때 처리되는 null값으로 따로 처리해주지 않아도 될 것 같다. 성공! 아직 초반이라 문제가 쉬운 것 같다. |
code engn advance 4번 (0) | 2018.02.08 |
---|---|
code engn advance 3번 (0) | 2018.02.08 |
code engn advance 1번 (0) | 2018.02.04 |
code engn basic 20번 (0) | 2018.02.04 |
code engn basic 19번 (0) | 2018.02.04 |
예전에 우연찮게 접했던 어느 고등학생분이 만든 워게임 사이튼데 재밌게 문제 풀다가 막혔던 웹 문제하나가 있었는데 ctf랑 딴 워게임들 풀다가 갑자기 영감이 떠올라서 다시 풀어보게 됬다.
들어가보면 아래와 같이 로그인 기능이랑 계정 등록 기능, 패스워드 찾기 기능 정도가 있다.
여기서 아무계정이나 하나 만들어서 들어가면 메일 보내기 관련 기능이 몇개 있는데 SQLi나 XSS로 admin 세션 따보려고 했는데 딱히 먹히는게 없었다. 그 중에 Members 기능에 접근하면 admin이 아니라 접근이 안됬었다.
어찌됫든 admin으로 로그인을 해야 될 것 같았는데 SQLi로 비밀번호를 딸 수 있는 상황도 아니었고 XSS도 필터링이 빡세게 되있어서 먹히지가 않았다. 그래서 가입할때 애초에 admin으로 가입을 해봐야 겠다고 생각했다. 근데이미 admin계정이 있었기 때문에 admin 1으런 식으로 가입해주면 admin으로 로그인이 가능했고 Members 메뉴에 접근할 수 있었다.
들어가보면 다음과 같이 멤버에 대한 정보를 조회하는 기능이 있었다.
일단 조회를 해보니 다음과 같이 특정 url을 파라미터로 넘기고 있었고 응답값으로 계정 정보가 출력되는 걸 볼 수 있었는데 이 때 파라미터로 날라가는 url에 직접접근해보면 다음과 같이 xml파일 정보를 받아오는걸 확인할 수 있었다.
일단 xxe인건 알겠고 여기서 url로 넘기는 값을 내 서버로 땡겨서 시도를 해봤는데 애초에 내 서버로 접근조차 안되는거 보니 요청 url정보에 대한 입력값 검증이 이루어 이루어지고 있는 것 같았다. 그래서 원래 서버로 xml내용을 요청할 때 응답값을 내가 원하는 형태로 조작할 수 있나 생각해봤고 search파라미터에서 SQLi가 터지는걸 볼 수 있었다.
여기서 SQLi를 통해서 xxe를 터트릴려고 했더니 위에처럼 내가 조작할 수 있는 영역이 External Entity를 박아넣을 수 없는 영역이었다. 여기서 xxe가 아닌가하고 디비에 뭔가 들어있나하고 디비정보를 다 털었는데 별다른 수확이 없었다.
여기까지가 이전에 문제를 풀었을 때인데 여기서 도저히 영감이 안떠올라서 나중에 풀어야겠다 하고 넘어갔었다. 근데 불현듯 왜 그때 인코딩 값을 안건드려봤지라고 생각이 들었고 다시 들어와서 인코딩값부분에 특정값을 넣어봤더니 요청한 xml에 내 인코딩 파라미터값이 넘어가고있는걸 확인할 수 있었다.
왜 그 땐 이부분을 간과하고 그냥 넘어갔을까. 웹 해킹하면서 요새 많이 느끼는건데 어느정도 공부 좀 했다고 내 지식선에서 100퍼를 단정짓고 이건 아니다 이런 고정관념에 사로잡히면 안되겠다 라는 생각을 많이 한다.
어쨋든 external entity를 선언할 수 있는 시점에서 이미 문제는 끝난거나 마찬가지였고 바로 index.php를 읽어오기위해서 구문을 짰다.
요런식의 xml문서를 만들어서 보내면 되겠다고 생각했고 그대로 url파라미터에 값을 담아서 넘겨봤다. (url인코딩해서 넘겨줬음)
해당 코드를 디코딩해서 봤는데 flag가 없었다.
웹 루트 index.php에 플래그가 있다했는데 현재디렉토리의 index.php가 웹루트 디렉토리가 아닌 것 같았고 ../index.php로 다시 시도해봤다.
플래그가 들어있었고 잘 나왔당.
code engn advance 1번 문제다. 열어보니 같은 내용에 그냥 값만 다르다. 문제와 같은 방식으로 풀어준 후 인증할때 md5값으로 바꾸기만 해주면 될 것 같다. |
code engn advance 3번 (0) | 2018.02.08 |
---|---|
code engn advance 2번 (0) | 2018.02.05 |
code engn basic 20번 (0) | 2018.02.04 |
code engn basic 19번 (0) | 2018.02.04 |
code engn basic 18번 (0) | 2018.02.04 |
codeengn basic 20번 문제다. 파일부터 실행해보자. 그냥 실행시키면 뭐가 없다. 패킹은 따로 되어있지 않다. 바로 열어보자. 우선 문제에서도 나와있듯이 키 파일을 열고 파일내용을 읽는 CreateFile, ReadFile 함수가 보인다. F8로 하나씩 실행하다보니 ReadFile 실행 후 CMP을 보면 4021A0의 값이 내가 입력한 bytes 크기인 9 파일의 내용을 다음과 같이 18bytes로 바꿔봤다. 동작시켜보니 정상적으로 JNZ SHORT 20.00401037을 통과한다. 그렇다면 이제 그 안을 분석할 차례이다. 우선 의심스러워 보이는 함수 두개를 BP걸고 내부로 들어가봤다. 여기서 이 알고리즘을 이해를 못해서 분석을 해보면 먼저 XOR을 통해 ECX,EAX를 0으로 초기화 한다. 다음과 같이 함수를 통해 암호화된 값들의 총합이 저장된 4020F9의 값과 12345678을 XOR하고 분석해보면 ESP+4 부분이 파일의 입력한 키 값이 담겨있는데 이를 ESI에 입력하고 ESI값에 0E를 ADD 다음으로 넘어가면 EAX값을 위에서 암호화하였던 4020F9값과 비교한다. 이 부분이 중요한데 다음의 SETE AL을 통해 AL값이 1이 나와야 TEST AL,AL구문을 통해 JE내부로 들어가 성공함수인 00401346으로 들어 갈 수 있다. 그렇다면 SETE AL을 통해 AL값이 1이 나오게 하는게 중요하는데 이를 위해선 CMP EAX,4020F9를 통해 ZF가 1이 되어야 하므로 EAX값이 4020F9값과 같아야한다.
실행해보니 다음과 같이 값이 뜬다. 무슨 값인가 했더니 다음 에서 볼 수 있듯이15~18bytes값을 담고있던 EAX의 앞부분이다. 즉 1~14bytes 부분인 암호화 되어 나온 키 값 부분에 마지막에 !가 함께 나온 것을 알 수 있다.
|
code engn advance 2번 (0) | 2018.02.05 |
---|---|
code engn advance 1번 (0) | 2018.02.04 |
code engn basic 19번 (0) | 2018.02.04 |
code engn basic 18번 (0) | 2018.02.04 |
code engn basic 17번 (0) | 2018.02.04 |
codeengn basic 19번 문제다. 파일부터 실행 해 보자. 저렇게 프로그램이 실행되고 어느정도 시간이 지나면 프로그램이 종료된다. 이제 패킹 확인후 파일부터 열어보자. 언패킹 후 파일을 실행해보니 실행이 안된다.
먼저 최초로 timeGetTime 함수가 실행되면 EAX에 반환된 프로그램 실행시작 값을 ESI에 저장시켜 놓는다. 그 후 CALL EDI를 통해 timeGetTIme 함수를 호출할 수 있기 떄문에 두번째로 실행시킨 함수의 값으로 최초시간과 비교를한다. 두번째로 호출된 함수는 항상 최초 시작값인 ESI값보다 클수밖에 없기 때문에 점프를 하여 다음 사진의 위치로 간다. 다음과 같이 점프해서 오면 EAX에는 두번째로 호출됬을때 시간값이 담겨있고 이를 최초값과 SUB한다. |
code engn advance 1번 (0) | 2018.02.04 |
---|---|
code engn basic 20번 (0) | 2018.02.04 |
code engn basic 18번 (0) | 2018.02.04 |
code engn basic 17번 (0) | 2018.02.04 |
code engn basic 16번 (0) | 2018.02.04 |
codeengn basic 18번 문제다. 실행해보면 다음과 같고 패킹이 따로되어있지않아 그대로 열면 된다. 코드를 봤는데 흐름이 전에문제들과 다를바가 없다. 결국 OR EAX,EAX에서 조건이 결정되는데 이때 이 다음과 같이 값을 넣어보니 첫번 째 함수 인자로 입력한 값이 들어간다. 그렇다면 두번째 인자가
17번에서 알고리즘 풀어보겠다고 엄청 애썼는데 다시 너무 쉬워져서 당황.. |
code engn basic 20번 (0) | 2018.02.04 |
---|---|
code engn basic 19번 (0) | 2018.02.04 |
code engn basic 17번 (0) | 2018.02.04 |
code engn basic 16번 (0) | 2018.02.04 |
code engn basic 15번 (0) | 2018.02.04 |
codeengn basic 17번 문제다. 파일부터 실행해보자. name이 1자리라고 해서 넣어봤더니 더 입력하란다. 뭔가 조건으로 막고 있는 것 같다. 패킹은 안되어 있으니 그냥 열어보자. 떡하니 점프문 앞에서 3이랑 비교를 하고 있다. 이걸 CMP EAX,1
그 다음 00404C3C 함수를 통해 분기문 조건이 설정되는데 결과 값을 보니 다음과 같이 EAX값은 고정
|
code engn basic 19번 (0) | 2018.02.04 |
---|---|
code engn basic 18번 (0) | 2018.02.04 |
code engn basic 16번 (0) | 2018.02.04 |
code engn basic 15번 (0) | 2018.02.04 |
code engn basic 14번 (0) | 2018.02.04 |