rev-basic-8 풀이
·
Security/Reverse Engineering
문제 설명 문제 풀이문제 파일을 IDA로 열어서 디컴파일을 해보면 다음과 같은 화면이 나온다.main 메소드 내에서는 별다른 분석거리가 없기 때문에 바로 분기 처리를 하는 sub_140001000 메소드 내부로 들어왔다.코드는 다음과 같다. __int64 __fastcall sub_140001000(__int64 a1){ int i; // [rsp+0h] [rbp-18h] for ( i = 0; (unsigned __int64)i  그리고 우리는 다음과 같은 식을 얻을 수 있다.-5 * a1[i] = byte_140003000[i] 근데 한가지 이상한 점이 있다. byte_140003000 주소에 있는 HEX 값들을 10진수로 변환한다고 했을 때,(음수) * x = (양의 정수)가 되어야 하는데 그렇..
rev-basic-7 풀이
·
Security/Reverse Engineering
문제 설명 문제 풀이IDA로 문제 파일을 열고 디컴파일을 하면 다음과 같은 코드가 나온다.바로 분기처리 담당 함수인 sub_140001000 으로 들어가보자.이를 통해 우리는 다음과 같은 연산식을 얻을 수 있다.byte_140003000[i] = (i ^ (unsigned __int8)__ROL1__(*(_BYTE *)(a1 + i), i & 7)) 식에서 ^ 연산과 & 연산은 알겠는데... 이상한 놈 하나가 중간에 끼어있다...__ROL1__이라는 놈인데 궁금해서 GPT 형님에게 물어봤다.  흠,,, 근데 함수 내부에서 두개의 인자를 받는 것으로 보아,,, 1바이트 순환하는게 아닌 *(a1 + i) 데이터를 i&7 만큼 순환하라는 의미 같았다. i&7만큼 왼쪽으로 순환해서 나온 결과를 다시 i와 xor..
rev-basic-5 풀이
·
Security/Reverse Engineering
문제 설명문제 풀이(x64dbg)문제 파일을 x64dbg에서 열고 '모든 문자열 참조 검색' 기능을 통해 main 메소드를 찾은 결과는 다음과 같다.이전 단계의 rev-basic 문제를 풀었다면 어디가 문자열 비교 함수인지 쉽게 알 수 있을 것이다. 140001000 주소로 들어가보자.대충 어디서부터 어디까지가 문자열에 대한 연산을 수행하는지 보일 것이다.140001024부터 140001053까지만 봐도 충분할 것 같다. 한줄씩 분석해보자. 1. movsxd rax,dword ptr ss:[rsp] : 스택의 값을 부호 확장하여 rax에 저장(rax는 1, 현재 루프 인덱스)2. mov rcx,qword ptr ss:[rsp+20] : 스택의 [rsp + 20]에서 값을 rcx로 이동(사용자 입력의 시작..
rev-basic-4 풀이
·
Security/Reverse Engineering
문제 설명문제 풀이(x64dbg)문제에서 내려받은 파일을 x64dbg로 열었을 때의 모습이다. 먼저 문자열 참조 검색 기능을 사용하여 main 함수를 찾아보자.여기서 분기문을 찾아보자. 당연히 'Correct' 문자열을 출력하는 부분 위에 있지 않겠는가?노란 하이라이트 부분에 커서를 올려보며 cmp 명령어가 포함되었는지 확인해본다. 140001000에 커서를 두고 미리보기를 했을 때, cmp 명령어가 포함되어 있으니 클릭하여 들어가보자.함수의 시작 주소가 140001000이고 ret 주소가 14000106E까지라서 살짝 길지만,,, 모든 줄을 한번 분석해보자. 1. mov qword ptr ss:[rsp+8],rcx : rcx(첫번째 함수 인자)값을 rsp+8(스택)에 저장2. sub rsp,18 : r..
rev-basic-6 풀이
·
Security/Reverse Engineering
문제 설명 문제 풀이(IDA)문제 파일을 IDA에서 열고 디컴파일 기능을 사용해보자. 그리고 바로 문자열 비교 함수 내부로 들어가보자.코드 자체는 오히려 앞선 문제들보다 훨씬 이해하기 쉬웠다.이 문제만의 차이점이라하면... 항상 데이터들은 140003000 주소에 저장이 되어있었는데, 이번에는 140003020 주소에도 저장이 되어있었다. 이번에는 특별히 이 함수가 어떤 호출 규약을 사용하는지 알아보았다. 함수 호출 규약이란 "함수가 호출될 때 인자를 전달하는 방식, 반환값을 처리하는 방법, 스택 정리 방식 등을 정의하는 규칙"을 말한다.다양한 호출 규약들이 있는데 쉽게 정리하자면 다음과 같다. 함수 호출 규약 종류__cdecl : 스택을 통해 인자 전달, Caller가 스택 정리(주로 C컴파일러에서 ..
rev-basic-3 풀이(IDA)
·
Security/Reverse Engineering
문제 설명 문제 풀이- 사용했던 툴 : IDA 이전에는 x64dbg를 활용하여 문제를 풀었는데 이번에는 IDA를 사용하여 문제를 풀어보았다.IDA에서 문제 파일을 열면 다음과 같은 화면이 나온다.편리하게도 박스로 어셈블리 코드를 묶어주고 순서도를 그려준다. IDA를 사용하는 가장 큰 이유는 바로 디컴파일 기능 때문이다. F5 단축키를 통해 변환시킬 수 있다.디컴파일을 하면 main 함수를 편리하게 볼 수 있다. 마치 C언어 환경과 비슷하다.코드 자체는 단순하다. 사용자 입력을 받고 그 입력이 저장된 문자열과 일치하면 Correct, 일치하지 않는다면 Wrong을 출력한다. 하지만 문자열 비교 과정은 복잡하다. sub_140001000을 더블 클릭하여 들어가보면 다음과 같은 화면이 나온다.결국에는 한글자씩..
Find The Lost Flag 풀이
·
Security/Web Hacking
문제 설명 문제 파일from flask import Flask, request, render_template_stringimport sqlite3app = Flask(__name__)def init_db(): conn = sqlite3.connect('challenge.db') c = conn.cursor() c.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username TEXT, password TEXT, secret TEXT)''') c.execute("INSERT OR IGNORE INTO users (id, username, password, secret) VALUES (1, 'admin', '*..
XSS Filtering Bypass 풀이
·
Security/Web Hacking
문제 설명 문제 파일#!/usr/bin/python3from flask import Flask, request, render_templatefrom selenium import webdriverfrom selenium.webdriver.chrome.service import Serviceimport urllibimport osapp = Flask(__name__)app.secret_key = os.urandom(32)try: FLAG = open("./flag.txt", "r").read()except: FLAG = "[**FLAG**]"def read_url(url, cookie={"name": "name", "value": "value"}): cookie.update({"domain"..