본문 바로가기

모의해킹

(163)
Stack (스택) • Stack(스택) - 메모리의 한 부분으로 먼저 들어간 게 최후에 나가는 자료구조 -> LIFO(Last Input First Output) 구조 - 함수 내의 로컬변수 임시 저장 - 함수 호출 시 파라미터 전달 - 복귀 주소(return address) 저장 • Stack Frame ESP(스택 포인터)가 아닌 EBP(베이스 포인터) 레지스터를 이용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소 등에 접근하는 기법이다. ESP 값은 프로그램 안에서 수시로 변하기 때문에 EBP를 함수 시작 전에 저장하고 유지하면 안전하게 변수, 파라미터, 복귀 주소등에 접근할 수 있다. • 실습(Stack Frame) 소스코드에서의 main의 위치를 찾는다. 00401026 주소를 실행시키면 ebp로 부터 4떨어진..
리버싱 기본명령어 • 명령어 실습 - jmp [ADDR] 해당 주소로 EIP 변화 (해당 주소를 점프함) 00401004 주소에서 00401007 주소로 EIP 변경 F7로 한 줄씩 실행시키면 00401006 주소를 안 지나감 - push [REG] : REG값을 스택에 채움 push 100 명령을 사용하면 스택 공간에 쌓인다. - pop [REG] : 스택에서 값을 빼서 REG에 채움 스택에 쌓여있던 100이 EAX에 넣어준다. - call [ADDR] : 현재 EIP를 스택에 Push 하고, 피연산자로 EIP 변화 call 명령어를 실행시키면 스택에 call 명령어 실행이 끝나면 00401016 주소 밑에 있는 0040101B 주소로 return 할 수 있게 스택에 쌓인다. - ret : 스택의 값을 빼서 EIP 변화..
Code Engn (Basic RCE L01) cmp로 eax 랑 esi 비교를 해서 ZF가 1이 아니라서 점프를 안 하게 되어 Error 메시지가 출력이 된다. 즉, 해당 부분을 점프로 성공 메시지를 출력 시키게 하면 되는 문제이다. 그렇기에 je를 jne는 ZF가 0이면 점프를 하기 때문에 jne로 수정을 해준다.
Deep Dive Reversing • 리버싱이란 - 프로그램의 실행파일을 분석하고 이해하는 과정 - 프로그램의 동작 원리, 알고리즘, 보안 기법 등을 파악할 수 있음 - 소프트웨어 제작 과정 > 소스 코드 작성 -> 컴파일/링크 -> 실행 가능한 Binary 파일 - 리버싱 과정 > Binary 파일 해석(어셈블리) -> 프로그램 소스 코드 추측 -> 목적 행위에 필요한 정보 수집 및 행위 실행 • 분석의 종류 - 정적 분석 : 바이너리 파일을 파일 구조를 통해 헤더, 코드 영역, 데이터 영역 등으로 나누고 필요한 정보를 수집하는 행위 > 정적 분석 도구 : Hxd, PEView, IDA, Ghidra - 동적 분석 : 파일을 실행시켜서 디버거 등의 툴을 이용해 메모리, 레지스터 등의 정보를 종합하여 실행단계에서 정보를 수집하는 행위 >..
nightmare 문제 접근 1. if($result ['id]) solve을 보면 어떤 id의 값을 가져오면 됨 2. 필터링 : _ . () # - 3. pw의 길이 6자 이하 -> pw의 값을 참으로 만든 다음 and부터는 주석으로 처리해주면 될 것 같음... 주석 부분은 # , - 문자를 사용하지 못하므로 %23, /**/, ;%00 중에 /**/ 은 사용하지 못함, %23 도 사용 못함 select id from prob_nightmare where pw=('')=0;%00 and id!='admin' 검색을 통해 문제를 풀었다,,, ('')=0 이 참으로 인식되는지 처음 알았다...
zombie_assassin 문제 접근 1. strrev 함수로 인해 뒤집어서 출력이 됨 2. addslashes 함수로 인해 id='' 두 번째 따옴표를 문자열로 \ 가 출력이 됨 select id from prob_zombie_assassin where id=%00&&pw=%23%201=1% 20ro%20 strrev 함수가 없을때의 페이로드는 id=%00&&pw= or 1=1 %23이다. id값에 %00(널 값)을 넣으면 addslashes 때문에 \ 가 자동으로 생기면서 'and pw='가 한 문자열이 된다.
succubus 문제 접근 1. ' 가 을 사용하지 않고 id 값만 출력되게 하면 된다. 즉, pw값을 무력화시켜줘 여한다. select id from prob_succubus where id='\' and pw='|| 1=1#' id='' 의 두 번째 따옴표 앞에 \ 을 넣으면 문자열로 인식이 된다. 그래서 id='\' and pw='가 한 문자열이 되고, || 1=1 # 로 인해 참 값이 되어 문제가 풀린다.
assassin 문제 접근 1. '(싱글쿼터) 필터링 2. like 절 특성(sqli 와일드카드) % 모든 문자 _ 한 글자 A% A로 시작하는 모든 문자 %A A로 끝나는 모든 문자 %A% A를 포함하는 모든 문자 3. admin pw 값 구하기 ___e% 의미는 앞에 3글자가 있고 네 번째의 글자가 e인 경우 import requests import string string = string.ascii_lowercase + string.digits url = 'https://los.rubiya.kr/chall/assassin_14a1fd552c61c60f034879e5d4171373.php?' cookie = {"PHPSESSID":"gcltff8itu5i5fc0lr3rel95vu"} str = '' for i in ..