# ASM writeup - Zh3r0CTF
This is a quick writeup of the asm challenges that I encountered.
## ASM 1
> What is returned sql(10)
>
> Flag format: zh3r0{Returned_Value}
> Author: Tourpran
Reading asm is not easy, especially for beginners. Fortunately, in my arsenal was a trick I learnt from AUCTF. The basic premise is that you just get the asm compiled and let your computer do the work for you xD
```
; asm1.rev
sql(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov eax, DWORD PTR [rbp-20]
mov edx, eax
shr edx, 31
add eax, edx
sar eax
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-20]
add eax, eax
mov DWORD PTR [rbp-8], eax
mov eax, DWORD PTR [rbp-4]
imul eax, DWORD PTR [rbp-8]
pop rbp
ret
```
If you know even basic of assembly you could probably patch it up to compilable assembly, but I have sadly not reached that level.
Thus, the way to proceed is to write a basic c structure program:
```cpp
#include <stdio.h>
int sql(int num) {
return num + num;
}
int main() {
printf("%d", sql(10));
return 0;
}
```
Then compile it using:
gcc -S -masm=intel -O0 test.c
that should give you a `test.s` file. Replace the assembly under .sql label.
Finally, the `test.s` file turns out to look like this:
```
.file "test.c"
.intel_syntax noprefix
.text
.globl sql
.type sql, @function
sql:
.LFB0:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
mov DWORD PTR [rbp-20], edi
mov eax, DWORD PTR [rbp-20]
mov edx, eax
shr edx, 31
add eax, edx
sar eax
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-20]
add eax, eax
mov DWORD PTR [rbp-8], eax
mov eax, DWORD PTR [rbp-4]
imul eax, DWORD PTR [rbp-8]
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size sql, .-sql
.section .rodata
.LC0:
.string "%d"
.text
.globl main
.type main, @function
main:
.LFB1:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
mov edi, 10
call sql
mov esi, eax
lea rdi, .LC0[rip]
mov eax, 0
call printf@PLT
mov eax, 0
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size main, .-main
.ident "GCC: (Debian 9.3.0-10) 9.3.0"
.section .note.GNU-stack,"",@progbits
```
Compile and run using:
gcc test.s
./a.out
The flag is `zh3r0{100}`
## ASM2
:::spoiler asm2.rev
```
start(int, int):
push rbp
mov rbp, rsp
sub rsp, 48
mov DWORD PTR [rbp-36], edi
mov DWORD PTR [rbp-40], esi
mov eax, DWORD PTR [rbp-36]
mov edi, eax
call f(int)
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-40]
mov edi, eax
call f(int)
mov DWORD PTR [rbp-8], eax
mov DWORD PTR [rbp-12], 0
mov DWORD PTR [rbp-16], 0
.L3:
cmp DWORD PTR [rbp-4], 0
jle .L2
mov edx, DWORD PTR [rbp-4]
movsx rax, edx
imul rax, rax, 1717986919
shr rax, 32
mov ecx, eax
sar ecx, 2
mov eax, edx
sar eax, 31
sub ecx, eax
mov eax, ecx
sal eax, 2
add eax, ecx
add eax, eax
mov ecx, edx
sub ecx, eax
mov esi, DWORD PTR [rbp-4]
movsx rax, esi
imul rax, rax, 1717986919
shr rax, 32
mov edx, eax
sar edx, 2
mov eax, esi
sar eax, 31
sub edx, eax
mov eax, edx
sal eax, 2
add eax, edx
add eax, eax
sub esi, eax
mov edx, esi
mov eax, ecx
imul eax, edx
add DWORD PTR [rbp-12], eax
mov eax, DWORD PTR [rbp-4]
movsx rdx, eax
imul rdx, rdx, 1717986919
shr rdx, 32
sar edx, 2
sar eax, 31
sub edx, eax
mov eax, edx
mov DWORD PTR [rbp-4], eax
jmp .L3
.L2:
cmp DWORD PTR [rbp-8], 0
jle .L4
mov edx, DWORD PTR [rbp-8]
movsx rax, edx
imul rax, rax, 1717986919
shr rax, 32
mov ecx, eax
sar ecx, 2
mov eax, edx
sar eax, 31
sub ecx, eax
mov eax, ecx
sal eax, 2
add eax, ecx
add eax, eax
mov ecx, edx
sub ecx, eax
mov esi, DWORD PTR [rbp-8]
movsx rax, esi
imul rax, rax, 1717986919
shr rax, 32
mov edx, eax
sar edx, 2
mov eax, esi
sar eax, 31
sub edx, eax
mov eax, edx
sal eax, 2
add eax, edx
add eax, eax
sub esi, eax
mov edx, esi
mov eax, ecx
imul eax, edx
add DWORD PTR [rbp-16], eax
mov eax, DWORD PTR [rbp-8]
movsx rdx, eax
imul rdx, rdx, 1717986919
shr rdx, 32
sar edx, 2
sar eax, 31
sub edx, eax
mov eax, edx
mov DWORD PTR [rbp-8], eax
jmp .L2
.L4:
mov DWORD PTR [rbp-20], 0
mov DWORD PTR [rbp-24], 1
.L8:
cmp DWORD PTR [rbp-24], 99
jg .L5
mov DWORD PTR [rbp-28], 1
.L7:
cmp DWORD PTR [rbp-28], 99
jg .L6
mov eax, DWORD PTR [rbp-12]
imul eax, DWORD PTR [rbp-24]
mov edx, eax
mov eax, DWORD PTR [rbp-16]
imul eax, DWORD PTR [rbp-28]
add eax, edx
add DWORD PTR [rbp-20], eax
add DWORD PTR [rbp-28], 1
jmp .L7
.L6:
add DWORD PTR [rbp-24], 1
jmp .L8
.L5:
mov eax, DWORD PTR [rbp-20]
leave
ret
f(int):
push rbp
mov rbp, rsp
push rbx
sub rsp, 24
mov DWORD PTR [rbp-20], edi
cmp DWORD PTR [rbp-20], 0
jne .L11
mov eax, 0
jmp .L12
.L11:
cmp DWORD PTR [rbp-20], 1
jne .L13
mov eax, 1
jmp .L12
.L13:
mov eax, DWORD PTR [rbp-20]
sub eax, 1
mov edi, eax
call f(int)
mov ebx, eax
mov eax, DWORD PTR [rbp-20]
sub eax, 2
mov edi, eax
call f(int)
add eax, ebx
.L12:
add rsp, 24
pop rbx
pop rbp
ret
```
:::
Asm2 looks a bit more harder, with two functions this time. That shouldn't be a problem for us. Writing the structure c program again:
```cpp
#include <stdio.h>
int f(int num) {
return num>>1;
}
int start(int num1, int num2) {
return f(num1) + num2;
}
int main() {
printf("%d", start(7,8));
return 0;
}
```
Compiling again using:
gcc -S -masm=intel -O0 test.c
Replacing the asm, `test.s` looks like:
:::spoiler test.s
```
.file "test.c"
.intel_syntax noprefix
.text
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
push rbx
sub rsp, 24
mov DWORD PTR [rbp-20], edi
cmp DWORD PTR [rbp-20], 0
jne .L11
mov eax, 0
jmp .L12
.L11:
cmp DWORD PTR [rbp-20], 1
jne .L13
mov eax, 1
jmp .L12
.L13:
mov eax, DWORD PTR [rbp-20]
sub eax, 1
mov edi, eax
call f
mov ebx, eax
mov eax, DWORD PTR [rbp-20]
sub eax, 2
mov edi, eax
call f
add eax, ebx
.L12:
add rsp, 24
pop rbx
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size f, .-f
.globl start
.type start, @function
start:
.LFB1:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
sub rsp, 48
mov DWORD PTR [rbp-36], edi
mov DWORD PTR [rbp-40], esi
mov eax, DWORD PTR [rbp-36]
mov edi, eax
call f
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-40]
mov edi, eax
call f
mov DWORD PTR [rbp-8], eax
mov DWORD PTR [rbp-12], 0
mov DWORD PTR [rbp-16], 0
.L3:
cmp DWORD PTR [rbp-4], 0
jle .L2
mov edx, DWORD PTR [rbp-4]
movsx rax, edx
imul rax, rax, 1717986919
shr rax, 32
mov ecx, eax
sar ecx, 2
mov eax, edx
sar eax, 31
sub ecx, eax
mov eax, ecx
sal eax, 2
add eax, ecx
add eax, eax
mov ecx, edx
sub ecx, eax
mov esi, DWORD PTR [rbp-4]
movsx rax, esi
imul rax, rax, 1717986919
shr rax, 32
mov edx, eax
sar edx, 2
mov eax, esi
sar eax, 31
sub edx, eax
mov eax, edx
sal eax, 2
add eax, edx
add eax, eax
sub esi, eax
mov edx, esi
mov eax, ecx
imul eax, edx
add DWORD PTR [rbp-12], eax
mov eax, DWORD PTR [rbp-4]
movsx rdx, eax
imul rdx, rdx, 1717986919
shr rdx, 32
sar edx, 2
sar eax, 31
sub edx, eax
mov eax, edx
mov DWORD PTR [rbp-4], eax
jmp .L3
.L2:
cmp DWORD PTR [rbp-8], 0
jle .L4
mov edx, DWORD PTR [rbp-8]
movsx rax, edx
imul rax, rax, 1717986919
shr rax, 32
mov ecx, eax
sar ecx, 2
mov eax, edx
sar eax, 31
sub ecx, eax
mov eax, ecx
sal eax, 2
add eax, ecx
add eax, eax
mov ecx, edx
sub ecx, eax
mov esi, DWORD PTR [rbp-8]
movsx rax, esi
imul rax, rax, 1717986919
shr rax, 32
mov edx, eax
sar edx, 2
mov eax, esi
sar eax, 31
sub edx, eax
mov eax, edx
sal eax, 2
add eax, edx
add eax, eax
sub esi, eax
mov edx, esi
mov eax, ecx
imul eax, edx
add DWORD PTR [rbp-16], eax
mov eax, DWORD PTR [rbp-8]
movsx rdx, eax
imul rdx, rdx, 1717986919
shr rdx, 32
sar edx, 2
sar eax, 31
sub edx, eax
mov eax, edx
mov DWORD PTR [rbp-8], eax
jmp .L2
.L4:
mov DWORD PTR [rbp-20], 0
mov DWORD PTR [rbp-24], 1
.L8:
cmp DWORD PTR [rbp-24], 99
jg .L5
mov DWORD PTR [rbp-28], 1
.L7:
cmp DWORD PTR [rbp-28], 99
jg .L6
mov eax, DWORD PTR [rbp-12]
imul eax, DWORD PTR [rbp-24]
mov edx, eax
mov eax, DWORD PTR [rbp-16]
imul eax, DWORD PTR [rbp-28]
add eax, edx
add DWORD PTR [rbp-20], eax
add DWORD PTR [rbp-28], 1
jmp .L7
.L6:
add DWORD PTR [rbp-24], 1
jmp .L8
.L5:
mov eax, DWORD PTR [rbp-20]
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE1:
.size start, .-start
.section .rodata
.LC0:
.string "%d"
.text
.globl main
.type main, @function
main:
.LFB2:
.cfi_startproc
push rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
mov rbp, rsp
.cfi_def_cfa_register 6
mov esi, 8
mov edi, 7
call start
mov esi, eax
lea rdi, .LC0[rip]
mov eax, 0
call printf@PLT
mov eax, 0
pop rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE2:
.size main, .-main
.ident "GCC: (Debian 9.3.0-10) 9.3.0"
.section .note.GNU-stack,"",@progbits
```
:::
Compiling and running `test.s`,
gcc test.s && ./a.out
We get the flag, `zh3r0{7350750}`