일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- tlqkf
- 액션바 필요없숴
- Docker
- 파이썬
- cmd2
- pwnable.kr
- Make sure the Cursor is initialized correctly before accessing data for it.
- kotlin
- pwnable
- 10814
- 포너블
- 6566
- 백준
- 클라우드란?
- 블록체인
- Couldn't read row 0
- 코틀린
- col -1 from CursorWindow
- pwable.kr
- 나이순 정렬
- python
- UNIQUE constraint failed
- Drive-By-Download
- java.lang.IllegalStateException
- SQLiteConstraintException
- cmd1
- 애너그램 그룹
- 페니빙
- 쏘큩
- 클라우드가 뭐야
- Today
- Total
푸르미르
pwnable.kr 6.random 본문
접속 후 ls
cat random.c
unsigned 변수 random에 rand()함수의 반환값(난수)을 넣었다.
key를 입력받고, key^random(XOR) == 0xdeadbeef와 같으면 flag(답)을 얻을 수 있다.
이렇게 보면 간단해보이는데 착각일 수 있으니 설레발 떨지 말아야지ㅎ
여기서 rand()만을 통해 난수를 한번 생성할 경우, 값이 고정이 되는 성질을 갖고 있다. => 컴파일을
몇번을 하더라도 난수가 같은 값이 생성된다는 뜻
gdb를 통해 컴파일하여 어셈블리어를 통해 rand()의 반환값이 무엇인지 알면 풀릴 것 같다.
gdb random
disas main ->main 함수 분석
체크한 부분 보면 rand 함수 호출 후 리턴값을 eax에 저장 후 0x400760이라는 주소에 저장했다.
이때 eax는 extended accumulator register로 산술, 논리 연산을 수행하고, 함수의 리턴값을 저장하는 레지스터이다.
0x0000000000400609주소에 중단점을 걸고,
다시 실행
$eax를 보면
0x6b8b4567이 저장되어있다.
그러면 scanf로 입력받은 key값과 0x6b8b4567이 xor연산하여 0xdeadbeef와
동일하면 된다!!
0x6b8b4567 XOR 0xdeadbeef 해주면 입력값 KEY값이 나온다. (XOR연산을 또 해주면 됨)
그런데 이때 DEC 값 즉 10진수값이 마이너스가 나온다. 하지만 여기서 주의할게 KEY는 UNSIGNED 변수이기 때문에 음수가 되어서는 안된다. 그래서 3039230856
flag값은 Mommy, I thought libc random is unpredictable...
'SECURITY > pwnable' 카테고리의 다른 글
pwnable.kr 8. leg (0) | 2021.04.28 |
---|---|
pwnable.kr 7. input (0) | 2021.04.06 |
pwnable.kr 5.passcode (문제 파악) (0) | 2021.03.31 |
pwnable.kr 4.flag (0) | 2021.03.31 |
pwnable.kr 3.bof (2) | 2021.03.24 |