목록분류 전체보기 (33)
D1N0's hacking blog
지난 글을 보지 않았다면 먼저 보고 오자 00_angr_find 들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리버싱 지식을 기본 전제로 하고 있다 모든 문제는 github.com/jakespringer/angr_ctf를 바탕으로 하였고, 바이너리 파 d1n0.tistory.com 시작 이번에 알아볼 것은 프로그램 실행 중에 피할 주소를 설정하는 방법이다 일단 angr_ctf의 01번 문제를 보며 알아보자 파일을 보면 00번과 비교해볼 때 유독 크기가 큰 것을 알 수 있다 아니나 다를까 기드라가 디컴파일을 실패했다 그러므로 우리는 간단한 흐름만 살펴보겠다 함수를 보면 눈에 띄는 게 있다 maybe_good은 실행해야 하는 함수, avoid_me는 실행하면 안 되..
들어가기 전에 이 글은 angr에 대해 배운 내용을 정리하는 글이다 C와 파이썬, 간단한 리버싱 지식을 기본 전제로 하고 있다 모든 문제는 github.com/jakespringer/angr_ctf를 바탕으로 하였고, 바이너리 파일은 github.com/Hustcw/Angr_Tutorial_For_CTF/tree/master/problems를 사용했다 또, 이를 활용한 블로그인 blog.notso.pro/2019-03-20-angr-introduction-part0를 바탕으로 공부하여 정리한 글임을 밝힌다 Angr란 우리가 일반적으로 리버싱 문제를 풀 때에는 암호화 함수를 역연산하여 원래의 비밀번호 등을 구한다 그러나 그 암호화 함수가 너무 길고 복잡하다면? 혹은 단순히 역연산 하기가 너무 귀찮다면? 이..
문제 풀이 세상에... 따옴표를 필터링하고 있다 지금까지 사용했던 SQL 인젝션 기법으로는 풀 수 없어 보인다 유일하게 전과 다른 것은 쿼리문에서 =이 아니라 like를 사용한다는 것이다 like는 =과 비슷하게 작동하여 전에 =을 우회하기 위해서도 사용하였지만 한 가지 큰 차이점이 있는데, 바로 와일드카드를 사용할 수 있다는 점이다 STEP 0 - SQL injection 취약점 확인 like는 특정 문자를 모르더라도 검색할 수 있는 와일드카드 %와 _를 지원한다 %는 문자의 길이에 관계없이 어떤 문자가 오던 상관없이 가져오고, _는 딱 한 글자를 어떤 문자던지 상관없이 가져온다 예를 들어, A%B라면 ACB, A1234B, AB 등을 모두 가져오고, A_B라면 ACB는 가져올 수 있지만 AB, A12..
문제 풀이 코드를 보면 입력받는 쿼리는 shit 하나이다 shit의 길이가 1을 넘으면 No Hack이 뜨고, 띄어쓰기, 개행, 캐리지 리턴, 탭도 필터링한다 필터링만 봐도 공백을 우회하는 방법을 묻는 문제임을 알 수 있다 아마 정상적으로 우회했다면 from과 prob_giant가 떨어지면서 SQL 구문이 정상적으로 1234를 반환할 것이다 풀이 shit=%0b shit=%0c 전에도 공백을 우회하는 비슷한 문제가 있었다 Lord of SQL injection - Wolfman 문제 풀이 언뜻 보면 pw=' or id = 'admin';%23으로 풀 수 있을 것 같지만 코드를 보면 공백을 필터링하고 있다 불필요한 공백을 지우더라도 or과 id는 띄워야 한다 SQL에서 공백은 Tab, Line Feed, ..
이 글에서는 64bit 환경에서의 함수 호출 과정을 알아보겠다 나는 함수 호출 규약을 64bit에선 fastcall만 쓰는 줄 알았는데, 찾아보니 vectorcall을 사용한다, 기본 64bit 호출 규약이 있다,... 말이 다 달라서 용어는 모르겠지만 나는 그냥 gcc 기본옵션으로 컴파일된 바이너리를 살펴보겠다 어차피 일반적으로 그냥 컴파일 된 바이너리를 제일 자주 볼 테니 말이다 물론 내가 기본옵션으로 컴파일 한 파일이 일반적인 방식으로 컴파일된 파일이 아닐 수도 있다 아무튼 나중에 자세히 알게된다면 이 부분에 대해선 다시 정리하겠다 이 글은 전 글과 연결되어 있으니 아직 보지 않았다면 이전 글을 보고 오는 것을 추천한다 C언어 함수 호출과정 - cdecl 포너블에서 너무 중요하고 기초적인 내용이지만..
포너블에서 너무 중요하고 기초적인 내용이지만 아직도 헷갈려서 정리한다 이 글은 독자가 기초적인 C언어와 어셈블리어를 알고 있는 상태라고 가정한다 모든 코드는 WSL Ubuntu 20.04 LTS에서 -m32 -no-pie 옵션을 사용해서 gcc로 컴파일 되었고, 실행 파일들은 글 하단에 올려놓았다 cdecl은 수많은 32bit 프로그램에서 사용되는 방식이다 함수를 호출하고, 호출자가 스택을 정리하는 호출자 정리 방식의 일종이다 #include int foo(int a, int b, int c) { return a+b+c; } int main() { int a = foo(1, 2, 3); return 0; } 위와 같은 C 코드를 짜고 32bit 컴파일을 했다 gef gdb로 까 보면 main 함수는 이렇..
z3 solver를 써볼 문제를 찾다가 이걸 선택하게 되었다 굳이 z3 solver를 안 써도 풀 수 있을 것 같기는 한데 그래도 이왕 배운 거 써먹어보고 싶었다 문제 풀이 분석 일단 주어진 파일의 hex값을 보면 elf파일임을 알 수 있다 실행을 해보면 입력을 받는다 그리고 바로 끝나는데 키가 맞으면 뭔가 일어날 것 같다 IDA로 까보면 입력을 받고 check_key를 실행하여 1이면 flag 파일을 열어 출력해주는 것을 알 수 있다 check_key 함수는 입력받은 문자열을 encoding 함수에 넣고 OO]oUU2U
Z3 solver z3 solver는 특정 값들을 찾아주는 SMT solver 모듈이라고 한다 쉽게 말하면 여러 수식을 풀어주는 모듈이라고 생각하면 된다 리버싱 할 때도 많이 필요하고 그게 아니더라도 유용히 쓸 수 있을 거 같아서 정리하기로 했다 설치 일단 Z3 solver 모듈의 링크는 이곳이다 github.com/Z3Prover/z3 들어가면 다양한 언어에서의 설치 과정이 자세히 나와있지만 나는 파이썬을 쓸 거라서 pip로 간단히 설치가 가능하다 pip install z3-solver or pip3 install z3-solver 기본 문법 사용 전 모듈 불러오기 from z3 import * 정수형 미지수 선언 x = Int('x') y = Int('y') 실수형 미지수 선언 x = Real('x'..
문제 풀이 5번 파일에 플래그가 있다는데 5번 버튼이 없다 다 눌러봐도 Nop만 뜬다 그런데 이동한 페이지를 자세히 보면 ?id=[숫자] 형태가 붙어있다 ?[파라미터 이름]=[파라미터 값] 형태로 데이터를 넘겨주는 것을 GET방식이라 하는데, 문제에서 id에 번호를 GET방식으로 넘겨주는 듯 하다 실제로 소스를 보면 id에 GET방식으로 각각 1,2,3,4를 넘겨주는 것을 알 수 있다 5번 파일에 플래그가 있다고 했으므로 ?id=5로 넘겨주면 플래그가 나온다 FLAG : HackCTF{idx_is_so_s1m3le_ctf}
문제 풀이 들어가보면 Hidden Flag라는 문구와 로봇 사진만 있다 아마 저 로봇 사진이 힌트인듯 하다 로봇과 웹 하면 생각할 수 있는게 robots.txt이다 robots.txt는 크롤링 봇들이 사이트에 접근하지 않도록 하는 일종의 안내문이다 사이트에서 robots.txt에 들어가보면 User-agent: * Disallow: /robot_flag/ 이런 것을 볼 수 있다 모든 봇에 대해 /robot_flag/ 로의 접근을 막겠다는 건데, 너무 수상해보인다 /robot_flag/에 들어가보면 바로 플래그가 나온다 FLAG : HackCTF{w3lcome_to_s1mple_web_h3cking!}