어떤 식으로 푸는지 알겠는데 asm으로 표현을 못하겠어요

asm 코드를 만들고 hex 로 convert 해서 입력하면 되는거죠?
asm 코드엔 argv 에 들어있는 문자열들에 대해 2개 문자(숫자)씩 뽑아서 3의 배수이면 answer에 그냥 더하고, 아니면 2배를 answer에 더하고, 나중에 100으로 나눈 나머지 값이 answer 되는 걸로 이해했어요.
근데 이걸 asm으로 표현하는게 익숙치 않네요. asm 확장자 파일은 nasm으로 nasm -f elf shellcode.asm 이런 식으로 변환하면 되나요? 근데 에러가 나요. mov DWORD PTR [rbp-xxx] ... 이런 표현식이 많이 쓰여야할 것 같은데, nasm에서 PTR 관련해서 warning이 많이 나오네요.
문제가 어려워서 이걸 풀지 못하니까, 다음 단계로 진도를 나갈수가 없네요. 강의를 들을수가 없습니다. 문제풀이를 보고 싶은데 방법이 없나요?

#reversing
작성자 정보
답변 2
Uz.
대표 업적 없음

파이썬의 pwntools 라이브러리를 통해 asm(),disasm() 함수를 이용해서 'mov rax,1'과 같은 어셈블리어 문자열을 16진수로 전환할 수 있습니다. 이를 이용하면 쉽게 코드를 작성하거나 변환하실 수 있습니다.

더해서 PTR 없이 문제풀이 가능합니다.

2021.12.29. 22:37

answer를 구하는 c 파일(runner2.c) 새로 만들어서 컴파일 후 disasseble 해서 어셈블 코드를 pwntools를 이용해 넣어서 문제를 푸는 방법을 시도해봤는데, jmp 위치를 어떻게 넣어야 할지 모르겠네요. 예를 들어, diasseble한 코드는 jmp 0x55555555521a <main+229> 이런 식으로 나오는데 pwntools에 절대값 주소를 넣으면 에러가 발생하고 오프셋 위치를 지정하면 정확히 계산이 안되서 틀린 결과를 얻게 됩니다. ㅠㅠ

./runner2 "['97', '94', '10', '76', '19', '27', '61', '48', '24', '31', '43', '35']"
answer = 31

반대로 컴파일된 runner2를 hexdump로 hex 값을 얻어서 문제입력 터미널에 입력하면 문자열 길이가 너무 길어서 잘리는것 같구요.

2022.01.03. 15:24
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기