일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ZIP 파일구조
- 디지털포렌식 with CTF
- 생활코딩
- 24시간의 전사
- 2022시작
- disk
- network
- N0Named
- 네트워크관리사2급
- slack space
- 실기
- pythonchallenge
- 윈도우 프로세스 종류
- 는 하지마...
- 정보처리기사 필기 합격
- 슬퍼유
- 디지털포렌식
- vinetto
- blkls
- Multimedia
- 생활코딩 html
- CTF-D
- Multimeida
- memory
- html
- 네트워크 보안
- Window process
- 포렌식
- ftz
- 윈도우 프로세스
- Today
- Total
ssoL2 TISTORY
pwnable.kr [leg] 본문
Daddy told me I should study arm.
But I prefer to study my leg!
Download : http://pwnable.kr/bin/leg.c
Download : http://pwnable.kr/bin/leg.asm
ssh leg@pwnable.kr -p2222 (pw:guest)
#include <stdio.h>
#include <fcntl.h>
int key1(){
asm("mov r3, pc\n");
}
int key2(){
asm(
"push {r6}\n"
"add r6, pc, $1\n"
"bx r6\n"
".code 16\n"
"mov r3, pc\n"
"add r3, $0x4\n"
"push {r3}\n"
"pop {pc}\n"
".code 32\n"
"pop {r6}\n"
);
}
int key3(){
asm("mov r3, lr\n");
}
int main(){
int key=0;
printf("Daddy has very strong arm! : ");
scanf("%d", &key);
if( (key1()+key2()+key3()) == key ){
printf("Congratz!\n");
int fd = open("flag", O_RDONLY);
char buf[100];
int r = read(fd, buf, 100);
write(0, buf, r);
}
else{
printf("I have strong leg :P\n");
}
return 0;
}
key1(), key2(), key3()은 asm 함수로 어셈블리로 되어있고...
main()보면 입력할 정수 key가 key1()+key2()+key3()과 동일해야 하므로 if문에서 비교하는 저 셋을 합친 값이 어떻게 되는지 gdb로 확인해보면 알 수 있을듯
gdb로 확인한 결과가 leg.asm에 저장되어 있음
main()보면 cmp 비교에서 r2랑 r3랑 비교함
r2가 key1()+key2()+key3()일거고
위에 key1, key2, key3의 함수 들어갔다가 나와서 모두 r0의 값을 r3, r4에 넣어서 add하는 등의 전처리를 진행함
고로 key 함수들은 결과값을 r0에 저장한다는 소리 => 각 key 함수들의 r0를 확인하자.
key1()에서 r0는 r3에서 왔고, r3는 pc에서 옴.
pc는 opcode의 pipe line 작업을 위한 다다음 주소를 저장하는 레지스터.
그렇다면 key+8에서의 pc는 key+16인 0x00008ce4이겠다. 이게 key1()의 r0임
key2()도 r0는 r3에서 왔고, r3는 pc+4에서 옴
pc는 key+20에의 pc 이므로 0x00008d08이고 여기서 +4한 값은 0x00008d0c임 key2()에서의 r0값은 0x8d0c
마지막 key3()에서는 pc가 아니라 lr에서 옴
lr는 함수 끝나면 되돌아갈 실행 주소를 담고 있음. 즉, key3()이 끝나고 main에서 다음 주소라는 뜻
key3 끝나면 mian+68로 감. 고로 key3()의 r0는 결국 0x8d80이 될 것임
최종 결산 두둥탁,
key1()+key2()+key3() = 0x00008ce4 + 0x00008d0c + 0x00008d80 = 1A770=108400(10진수)
key 입력할 때 정수로 받으니까(%d) 10진수로 108400 쳐넣으면 되겠습니다~
'challenge > pwn' 카테고리의 다른 글
pwnable.kr [input] (0) | 2021.06.30 |
---|---|
pwnable.kr [random] (0) | 2021.06.30 |
pwnable.kr [passcode] (0) | 2021.06.29 |
[FTZ] LEVEL 18 풀이 (0) | 2021.02.23 |
[FTZ] LEVEL 17 풀이 (0) | 2021.02.23 |